You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy处理未知结构JSON生成数据集的实现方案问询

解决方案:动态处理未知字段的JSON生成数据集

没问题,这需求完全能实现!咱们只需要对原代码做几处调整,就能动态适配任意字段数量的输入JSON,不用再硬编码字段名和取值逻辑。

核心思路

  1. 动态获取所有字段名:从JSON数组的第一个元素中提取所有键(默认假设所有JSON对象的字段结构一致,如果存在字段不一致的情况,后面会补充处理方案);
  2. 自动生成类型列表:根据字段名的数量,生成对应长度的全String类型列表;
  3. 动态提取字段值:遍历每条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:17:41