1

这个问题仍然是相关的!

在我的任务中,json 是我的输入,我事先并不知道。我需要将所有 json 字段类型收集到“类型”中,并使用reader.outputLines. 现在json字段类型的列表是这样形成的: def types = list.find (). Values ​​() *. GetClass () *. SimpleName 但是当第一个json块中的相同字段为null时,我遇到了一个问题,而在第二个中,整数和类型被定义为null,而不是整数。

  1. 如何确保通过遍历每个字段的所有 json 块来确定类型,而不是根据第一个块进行输出,如果所有内容均为 null 或“”(空),则分配默认字符串?
  2. 使用 json 从 json 返回值时reader.outputLines,将 null 替换为“”(空)?
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

        List names = list.inject( new LinkedHashSet<>() ){ res, map ->
            res.addAll map.keySet()
            res
        }.toList()
        def types = list.find().values()*.getClass()*.simpleName

        //formation of the dataset header
        reader.outputLinesSetHeaders(names,types);

        list.each{ e ->
            reader.outputLines names.collect{ e[ it ] }
            //println names.collect{ e[ it ] }
        }

        //closing dataset
        reader.outputLinesEnd();
        return null;

    }
    static void main(String... args) {
        String pfile =  """
[{"AUTO":"bmw",
  "HOME":null,
  "JOB":""},
  
  {"AUTO":"audi",
  "HOME":135,
  "JOB":null},
  
  {"AUTO":"opel1",
  "HOME":10,
  "JOB":null}]
"""
        def SSC = new XM_PARSE_XLS()
        def res = SSC.execute(new ResultSetReader(), pfile)
    }
}
4

1 回答 1

1

我建议采用以下策略:迭代行,直到您知道每种类型或达到某种结束(取决于行数,您可能只想查看所有行或在 N 行后放弃)。对于每一行,尝试确定类型并保留该类型的 book,但仅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]
于 2020-11-12T11:53:19.400 回答