在groovy(java)中,如何自动查找json字段类型并从json返回值,将null替换为空空间?

在groovy(java)中,如何自动查找json字段类型并从json返回值,将null替换为空空间?,java,arraylist,groovy,jsonslurper,Java,Arraylist,Groovy,Jsonslurper,这个问题仍然相关 在我的任务中,json进入我的输入,我事先不知道。我需要将所有json字段类型收集到“类型”中并返回所有值​​使用读卡器.outputLines。现在json字段类型列表的格式如下: def types=list.find()。价值观​​() *. GetClass()*。SimpleName 但当第一个json块中的同一字段为null,而第二个json块中的整数和类型定义为null,而不是integer时,我会遇到一个问题 如何确保通过遍历每个字段的所有json块来确定类型,

这个问题仍然相关

在我的任务中,json进入我的输入,我事先不知道。我需要将所有json字段类型收集到“类型”中并返回所有值​​使用
读卡器.outputLines
。现在json字段类型列表的格式如下:
def types=list.find()。价值观​​() *. GetClass()*。SimpleName
但当第一个json块中的同一字段为null,而第二个json块中的整数和类型定义为null,而不是integer时,我会遇到一个问题

  • 如何确保通过遍历每个字段的所有json块来确定类型,并且不基于第一个块进行输出,如果所有内容都为null或“”(空),则分配默认字符串
  • 返回值时​​从json使用
    阅读器.outputLines
    ,将null替换为“”(空)
  • import groovy.json.JsonSlurper
    导入ru.itrpro.xm.plugins.groovy.ResultStreamer;
    类XM_PARSE_XLS{
    def execute(结果跟踪程序读取器,字符串pfile){
    def jsonSlurper=新的jsonSlurper()
    def list=jsonSlurper.parseText pfile
    List names=List.inject(new LinkedHashSet()){res,map->
    res.addAll map.keySet()
    物件
    }托利斯先生()
    def types=list.find().values()*.getClass()*.simpleName
    //数据集标题的形成
    reader.outputLinesSetHeaders(名称、类型);
    列表。每个{e->
    reader.outputLines names.collect{e[it]}
    //println names.collect{e[it]}
    }
    //关闭数据集
    reader.outputLinesEnd();
    返回null;
    }
    静态void main(字符串…参数){
    字符串pfile=“”
    [{“自动”:“宝马”,
    “HOME”:空,
    “作业”:“},
    {“自动”:“奥迪”,
    “家”:135,
    “作业”:null},
    {“自动”:“opel1”,
    “家”:10,
    “作业”:null}]
    """
    def SSC=新的XM_PARSE_XLS()
    def res=SSC.execute(新结果跟踪程序(),pfile)
    }
    }
    
    我建议采用以下策略:在行上迭代尽可能长的时间,直到 你知道每种类型或者你达到了某种目的(取决于 行的数量,您可能只想查看所有行或放弃 N行之后)。对于每一行,试着确定类型,并保留记录 类型,但仅“升级”从
    null
    到簿记中的类型

    import groovy.json.JsonSlurperClassic
    
    def data = new JsonSlurperClassic().parseText("""
    [{"AUTO":"bmw",   "HOME":null, "JOB":""},
     {"AUTO":"audi",  "HOME":135,  "JOB":null},
     {"AUTO":"opel1", "HOME":10,   "JOB":null}]
    """)
    
    def types = [:]
    def it = data.iterator() // or only take(10) e.g.
    while (it.hasNext() && !(types && types.every{ _, v -> v })) {
        it.next().collectEntries{ k, v -> 
            [k, v?.getClass()?.simpleName] 
        }.inject(types, { m, entry ->
            if (entry.value!=null || !m.containsKey(entry.key)) {
                m[entry.key] = entry.value
            }
            return m
        })
    }
    
    // if there are types missing (values with null), replace them here with
    // your default)
    
    println types
    // → [AUTO:String, JOB:String, HOME:Integer]
    

    谢谢你回答我的问题。在播放代码时,会出现类似这样的错误:当前版本不支持“do while”,根据描述判断,输出为“Typles:Value”,我需要单独的“type”来形成数据集标题,并使用reader.outputLinesTheaders和单独的“Value”来使用“reader.outputLines”。我对代码有点误解。Do/while没有在groovy中使用,显然Do/while是在3IIRC中添加的。如果你被旧版本卡住了,你可以重写一下。是的,上面的代码计算类型并将结果存储在map中。代码应该在服务器上工作,并且没有办法更改版本“不工作”一点帮助都没有。我重写了循环
    import groovy.json.JsonSlurperClassic
    
    def data = new JsonSlurperClassic().parseText("""
    [{"AUTO":"bmw",   "HOME":null, "JOB":""},
     {"AUTO":"audi",  "HOME":135,  "JOB":null},
     {"AUTO":"opel1", "HOME":10,   "JOB":null}]
    """)
    
    def types = [:]
    def it = data.iterator() // or only take(10) e.g.
    while (it.hasNext() && !(types && types.every{ _, v -> v })) {
        it.next().collectEntries{ k, v -> 
            [k, v?.getClass()?.simpleName] 
        }.inject(types, { m, entry ->
            if (entry.value!=null || !m.containsKey(entry.key)) {
                m[entry.key] = entry.value
            }
            return m
        })
    }
    
    // if there are types missing (values with null), replace them here with
    // your default)
    
    println types
    // → [AUTO:String, JOB:String, HOME:Integer]