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