JSON到Groovy,带有JsonSlurper和unknown“;“字符串”;

JSON到Groovy,带有JsonSlurper和unknown“;“字符串”;,json,grails,groovy,Json,Grails,Groovy,我正在编写一个Grails/Groovy应用程序,我在params成员中有一个JSON对象,该对象具有一个“string”名称(grommet和widget),可以更改。也就是说,下次它可能是acme和zoom。以下是JSON: def jx = """{ "job": "42", "params": { "grommet": {"name": "x", "data": "y"}, "widget": { "name": "a", "data":

我正在编写一个Grails/Groovy应用程序,我在params成员中有一个JSON对象,该对象具有一个“string”名称(grommetwidget),可以更改。也就是说,下次它可能是acmezoom。以下是JSON:

def jx = """{ 
    "job": "42",
    "params": {
        "grommet": {"name": "x", "data": "y"},
        "widget": { "name": "a", "data": "b"}
    } 
}"""
我正在想办法弄到绳子索环。迄今为止的代码:

def dalist = new JsonSlurper().parseText(jx)
println dalist.job     // Gives: 42
println dalist.params  // Gives: [grommet:[name:x, data:y], widget:[name:a, data:b]]
println dalist.params[0]  // Gives: null

你知道怎么拿到弦索环吗?我会一直把头撞在墙上。

这是
Map
实例,试试:

def params = dalist.params.entrySet() as List  // entrySet() returns Set, but it's easier to use it as a List
println params
println params.size()
println params[0]
println params[0].key
println params[0].value

JSON对象上的
params
键与JSON对象关联,而不是与数组关联,因此无法通过索引访问它。JsonSlurper将JSON对象映射到Groovy映射,因此您可以通过其键访问
params
,这些键是字符串,例如
dalist.params.grommet
,这将为您提供映射
[名称:'x',数据:'y']

要访问
params
上的键,您可以执行
dalist.params.keySet()
,这将为您提供列表
['grommet','widget']
。如果您只想知道
params
键,那么就应该做到这一点。如果出于某种原因需要获取
'grommet'
字符串,可以通过访问该列表上的第一个元素来实现,即
dalist.params.keySet()[0]
,但我不知道您为什么想知道这一点。我不确定是否保证该映射的第一个键始终是
“grommet”
,因为JSON对象按照规范是无序的(from:object是无序的名称/值对集),但反过来,Groovy映射是有序的(默认实现是LinkedHashMap)。。。因此,我假设在将JSON解析到Groovy世界时,顺序是保持不变的,但我尽量不依赖于特定的行为,呵呵。

这可能会对您有所帮助

import groovy.json.JsonSlurper;
def jx='{"job":"42","params":{"grommet":{"name":"x","data":"y"},"widget":{"name":"a","data":"b"}}}'

def dalist = new JsonSlurper().parseText( jx )

assert dalist.params.getClass().name == "java.util.HashMap";
assert dalist.params.size() == 2;

def keys = dalist.params.collect{ a, b -> a}; // returns "[grommet, widget]"
assert !!dalist.params.get( "grommet" ) == true

我再次查看了api,因为我认为它返回了Object(doh!),但没有看到它返回了列表和映射。谢谢你的回答。谢谢,这正是我认为我应该能够做到的。现在我选哪一张支票?所有三个答案都正确。@rtfminc您可以将所有三个答案进行投票,然后随机选择一个。irb(main):001:0>rand(3)+1=>1互联网络已经发言,选择答案1。谢谢大家。