【发布时间】:2016-09-28 12:00:06
【问题描述】:
在 Groovy(不是 Grails)中,我想获得这样一个项目的颜色:
{
"8436": {
"color": "red",
}
}
“8436”号码是动态的,但始终只有一个。
我不能使用 JsonSlurper 的 json.8436.color 语法,因为数字会被硬编码。
如何获取颜色?
【问题讨论】:
标签: json groovy jsonslurper
在 Groovy(不是 Grails)中,我想获得这样一个项目的颜色:
{
"8436": {
"color": "red",
}
}
“8436”号码是动态的,但始终只有一个。
我不能使用 JsonSlurper 的 json.8436.color 语法,因为数字会被硬编码。
如何获取颜色?
【问题讨论】:
标签: json groovy jsonslurper
另一个选项,给定:
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'
【讨论】:
由于您对 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'
【讨论】:
No signature of method: java.util.HashMap$KeySet.getAt() is applicable for argument types: (java.lang.Integer) values: [0]
json.keySet().iterator().next(),(2)像以前一样将集合强制为列表和索引: (json.keySet() as List)[0], (3) 从一个空列表开始,然后将集合添加到它,然后像以前一样索引:`([] + json.keySet())[0],等等,主题有很多变化。
Iterable.getAt(int) 是在 Groovy 中定义的,所以我无法想象为什么 java.util.HashMap$KeySet 无法识别它,因为该类实现了 Iterable(顺便说一下,Collection Set)。在我看来,这似乎是 Groovy 中的一个错误,但我之前一直错在这。
getAt()。但是,BalRog 的建议:keySet().iterator().next() 应该适用于任何 groovy 版本。
更新:更好(更惯用的?)方式
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
【讨论】: