在Groovy中获取具有随机名称的单节点的JSON子节点

时间:2016-09-28 12:00:07

标签: json groovy jsonslurper

在Groovy(不是Grails)中,我想获得这样一个项目的颜色:

{
    "8436": {
        "color": "red",
    }
}

“8436”号码是动态的,但总是只有一个。

我无法使用JsonSlurper的json.8436.color语法,因为该数字将是硬编码的。

如何获得颜色?

3 个答案:

答案 0 :(得分:4)

另一种选择,给出:

def jsonStr = '''{
    "8436": {
        "color": "red",
    }
}'''

你可以这样做:

import groovy.json.JsonSlurper

def json = new JsonSlurper().parseText(jsonStr)

def (rootKey, color) = json.findResult { k, v -> [k, v.color] }

assert rootKey == '8436'
assert color == 'red'

答案 1 :(得分:2)

由于你对json输入的结构有所了解,你可以利用root是一个包含一个键的映射这一事实。

像这样:

import groovy.json.JsonSlurper
def json = new JsonSlurper().parseText('{"8436":{"color":"red"}}')
def rootKey = json.keySet()[0]
assert rootKey == '8436'
assert json[rootKey].color == 'red'

答案 2 :(得分:0)

更新:更好(更惯用?)方式

import groovy.json.JsonSlurper

def jsonStr = """
{
    "8436": {
        "color": "red",
    }
}
"""
def json = new JsonSlurper().parseText(jsonStr)

def color = json.each {}.collect{it.value.color}[0]

println color

=======旧版本,存储在一个闭包外部变量中=======

为什么不这样:

import groovy.json.JsonSlurper

def jsonStr = """
{
    "8436": {
        "color": "red",
    }
}
"""
def json = new JsonSlurper().parseText(jsonStr)

def color
json.each { color = it.value.color}

println color