如何列出json字段名称和值?

问题描述

请帮助我找出问题所在。我用groovy编程(您可以使用一个Java示例,看起来像那里)。杰森进入输入,其中不知道有多少个字段。可能有5个字段,可能是10个,也许是50个。我的任务是处理json并使用以下命令返回数据:

// Names of dataset columns
def names = ["a","b","c"];
// types of return values ​​in each column (for any field (column) json is always String)
def types = ["String","String","String"];
// formation of the dataset header
reader.outputLinesSetHeaders (names,types);
// Passing the data itself from json
reader.outputLines ([it.a,it.b,it.c])
// Close the dataset
reader.outputLinesEnd ();

如果我知道传入的json,那么我将预先设置所需的字段名称,即“ String”的数量,并通过引用特定的json字段返回其值。下面的示例显示了3个json字段:自动首页,作业。因此,对于每个字段并引用特定字段3次“字符串”,以返回it.auto,it.home,it.job的值。但是,如果我不知道传入的json,该怎么办?

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)



        //The names of the columns of the dataset (Now set statically to show an example; but in my case I don't kNow json and can't write it this way in advance)
        def names = ["AUTO","HOME","JOB"];
        //return types in each column (for any json,only "String" types)
        def types = ["String","String"];

        //формирование заголовка датасета
        reader.outputLinesSetHeaders(names,types);


                list.each {
                        //pass the values as a dataset from json (Now set statically to show an example; but in my case I don't kNow json and can't write it this way in advance)
                        reader.outputLines([it?.AUTO,it?.HOME,it?.JOB]);
                }

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



    }
    static void main(String... args) {
            String pfile =  """
[{"AUTO":"bmw","HOME":"vest","JOB":"bbds"},{"AUTO":"audi","HOME":"dest","JOB":"aads"},{"AUTO":"opel","HOME":"lest","JOB":"ffds"}]
"""
            def SSC = new XM_PARSE_XLS()
            def res = SSC.execute(new ResultSetReader(),pfile)

    }

}

也许值得将传入json的所有字段名称收集到一个列表中,并指定一个与字段编号相同的“ String”列表(任何传入的json的所有字段都只有“ String”)?但是如何执行此操作,然后又应该如何传递字段值(它是***)呢?

解决方法

如果输入JSON属于对象(键-值对)类型,则将其解析为Map,因此您可以使用其方法进行检查。

import groovy.json.JsonSlurper

String pfile =  """
[{"AUTO":"bmw","HOME":"vest","JOB":1},{"AUTO":"audi","HOME":"dest","JOB":2},{"AUTO":"opel","HOME":"lest","JOB":3}]
"""
def jsonSlurper = new JsonSlurper()
def list = jsonSlurper.parseText pfile

List names = list.inject( new HashSet() ){ res,map ->
  res.addAll map.keySet()
  res
}.toList()

// get types based on actual values
def types = list.first().values()*.getClass()*.simpleName

assert '[AUTO,JOB,HOME]' == names.toString()
assert '[String,String,Integer]' == types.toString()

//reader.outputLinesSetHeaders names,types

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

//reader.outputLinesEnd()

注释掉这些行,以避免编译问题。

,

假设您只想知道键和值的类型, 可以创建所有键/类型的并集。假设值类型 一个键在所有键上都是相同的。

import groovy.json.JsonSlurper

def data = new JsonSlurper().parseText("""[{"a": 1,"b": 2,"c": 3,"x": true},{"a": 4,"b": 5,"c": 6,"d": "Hello"}]""")
def content = data.collectEntries{ 
    it.collectEntries{ 
        [it.key,it.value.class.name] 
    } 
}

println content
// → [a:java.lang.Integer,b:java.lang.Integer,c:java.lang.Integer,x:java.lang.Boolean,d:java.lang.String]