使用 Groovy 获取 JSON 对象中的值类型

问题描述

我有以下要检查的 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

我已经搜索了几种不同的方法,但大多数在我的情况下都不起作用。现在对其中之一进行了注释,如上面的代码所示。

任何建议将不胜感激!

解决方法

像这样:

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]'
,

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

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]