2

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

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

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

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

如何获得颜色?

4

3 回答 3

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'
于 2016-09-28T15:32:06.373 回答
2

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

像这样:

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'
于 2016-09-28T12:31:43.223 回答
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
于 2016-09-28T15:51:58.127 回答