【问题标题】:Get type of value within JSON object using Groovy使用 Groovy 获取 JSON 对象中的值类型
【发布时间】:2021-07-19 08:24:28
【问题描述】:

我有以下我想要检查的 JSON 对象

import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper() 
import groovy.json.JsonOutput;

def object = jsonSlurper.parseText '''
{
  "id" : 10,
  "docType" : "PDF",
  "values" : {
      "color" : "red",
      "pages" : 2,
    },
  "versions" : [
    {
      "verNum" : 1,
      "desc" : "This is the description for it"
    }
  ]
}
'''
// def data = new JsonSlurper().parseText("""[{"a": 1, "b": 2, "c": 3, "x": true}, {"a": 4, "b": 5, "c": 6, "d": "Hello"}]""")
// def content = object.collectEntries{ 
//    it.collectEntries{ 
//        [it.key, it.value.class.name] 
//    } 
//}

//println content

我想遍历每个键并使用 Groovy 检查类型,例如: id - java.lang.Integer, docType - java.lang.String, values.color - java.lang.String, 数组内对象内的verNum将是java.lang.Integer

我已经搜索了几种不同的方法,但其中大多数都不适用于我的情况。其中一个现在像上面的代码一样被注释了。

任何建议将不胜感激!

【问题讨论】:

    标签: java arrays json groovy jsonslurper


    【解决方案1】:

    类似这样的:

    import groovy.json.JsonSlurper
    
    def object = new JsonSlurper().parseText '''
    {
      "id" : 10,
      "docType" : "PDF",
      "values" : {
          "color" : "red",
          "pages" : 2,
        },
      "versions" : [
        {
          "verNum" : 1,
          "desc" : "This is the description for it"
        }
      ]
    }
    '''
    
    def res = [:]
    def traverser
    traverser = { Map m ->
      m.each{ k, v ->   
        switch( v ){
          case Map:
            res[ k ] = Map
            traverser v
            break
          case List:
            res[ k ] = List
            v.each traverser
            break
          default:
            res[ k ] = v?.getClass()
        }
      }
    }
    
    traverser object
    
    def simple = res.collectEntries{ k, v -> [ k, v.simpleName ] }
    assert simple.toString() == '[id:Integer, docType:String, values:Map, color:String, pages:Integer, versions:List, verNum:Integer, desc:String]'
    

    【讨论】:

    • 工作得很好!传奇!
    【解决方案2】:

    我认为您应该在示例中使用数据变量而不是对象。

    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]
    

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多