Groovy处理未知结构JSON生成数据集的实现方案问询
解决方案:动态处理未知字段的JSON生成数据集
没问题,这需求完全能实现!咱们只需要对原代码做几处调整,就能动态适配任意字段数量的输入JSON,不用再硬编码字段名和取值逻辑。
核心思路
- 动态获取所有字段名:从JSON数组的第一个元素中提取所有键(默认假设所有JSON对象的字段结构一致,如果存在字段不一致的情况,后面会补充处理方案);
- 自动生成类型列表:根据字段名的数量,生成对应长度的全
String类型列表; - 动态提取字段值:遍历每条JSON数据时,根据字段名列表依次取出对应的值,组装成传入
outputLines的参数。
修改后的完整代码
import groovy.json.JsonSlurper import ru.itrpro.xm.plugins.groovy.ResultSetReader; class XM_PARSE_XLS { def execute(ResultSetReader reader, String pfile) { def jsonSlurper = new JsonSlurper() def list = jsonSlurper.parseText(pfile) // 1. 动态获取所有字段名:取第一个元素的所有键(处理空数组的边界情况) def names = list.isEmpty() ? [] : list[0].keySet().toList() // 2. 自动生成对应长度的String类型列表 def types = names.collect { "String" } // 生成数据集表头 reader.outputLinesSetHeaders(names, types); list.each { item -> // 3. 动态提取每个字段的值:按names列表顺序取值,空安全操作符避免空指针 def values = names.collect { item?."$it" } reader.outputLines(values); } // 关闭数据集 reader.outputLinesEnd(); return null; } static void main(String... args) { // 测试用JSON可随意修改字段数量,代码自动适配 String pfile = """ [{"AUTO":"bmw", "HOME":"vest", "JOB":"bbds"}, {"AUTO":"audi", "HOME":"dest", "JOB":"aads"}] """ def SSC = new XM_PARSE_XLS() def res = SSC.execute(new ResultSetReader(), pfile) } }
补充:处理JSON元素字段不一致的情况
如果输入JSON数组中,不同对象的字段可能不统一(比如有的有AUTO,有的没有),可以先收集所有出现过的字段名:
// 收集所有JSON对象中出现过的字段名,去重后可选排序 def allKeys = list.inject([]) { keys, item -> keys.addAll(item.keySet()) return keys.unique() }.sort() def names = allKeys
这样生成的表头会包含所有出现过的字段,缺失字段的JSON对象对应位置会返回null,完全兼容这种场景。
关键代码说明
list[0].keySet().toList():从第一个JSON对象中提取所有字段名,转成有序列表;names.collect { "String" }:利用Groovy的闭包快速生成和字段数量一致的String类型列表;names.collect { item?."$it" }:通过GString动态调用字段名取值,?.操作符确保字段不存在时返回null而非抛出异常。
内容的提问来源于stack exchange,提问作者Ekz0
相关产品推荐
相关产品推荐

