使用 JsonSlurper 和未知“字符串”的 JSON 到 Groovy

Posted

技术标签:

【中文标题】使用 JsonSlurper 和未知“字符串”的 JSON 到 Groovy【英文标题】:JSON to Groovy with JsonSlurper and unknown "string" 【发布时间】:2012-06-19 03:05:10 【问题描述】:

我正在编写一个 Grails/Groovy 应用程序,并且我在 params 中有一个带有“字符串”名称(grommetwidget)的 JSON 对象strong> 可以改变的成员。也就是说,下一次可能是 acmezoom。这是 JSON:

def jx = """ 
    "job": "42",
    "params": 
        "grommet": "name": "x", "data": "y",
        "widget":  "name": "a", "data": "b"
     
"""

我正在尝试弄清楚如何获取字符串 grommet 。到目前为止的代码:

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

知道如何获取字符串 grommet 吗? Iama 会一直把我的头撞到墙上。

【问题讨论】:

irb(main):001:0> rand(3) + 1 => 1 互联网已发言,选择答案 1。谢谢大家。 【参考方案1】:

JSON 对象上的 params 键与 JSON 对象关联,而不是数组,因此您无法通过索引访问它。 JsonSlurper 将 JSON 对象映射到 Groovy Maps,因此您可以通过其键访问params,这些键是字符串,例如dalist.params.grommet,它会给你地图[name: 'x', data: 'y']

要访问params 上的密钥,您可以执行dalist.params.keySet(),这将为您提供['grommet', 'widget'] 列表。如果您只想知道params 键,那应该可以解决问题。如果您出于某种原因需要获取'grommet' 字符串,您可以通过访问该列表中的第一个元素来完成,即dalist.params.keySet()[0],但我不知道您为什么想知道这一点。而且我不确定是否保证该映射的第一个键将始终为'grommet',因为 JSON 对象未按规范排序(来自json.org:对象是一组无序的名称/值对),但反过来,Groovy 映射 是有序的(默认实现是 LinkedHashMap)...所以我假设在将 JSON 解析到 Groovy 世界时会保留顺序,但我会尽量不要依赖这种特定的行为,呵呵。

【讨论】:

我再次查看了 api,因为我认为它返回了 Object(doh!)并且没有看到它返回了列表和地图。感谢您的回答。【参考方案2】:

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

【讨论】:

【参考方案3】:

这可能会对你有所帮助。

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

【讨论】:

谢谢,这是我认为我应该能够做到的。现在我该选择哪一张支票?所有三个答案都在标记上。 @rtfminc 你可以对这三个都投赞成票,然后随机选择一个。

以上是关于使用 JsonSlurper 和未知“字符串”的 JSON 到 Groovy的主要内容,如果未能解决你的问题,请参考以下文章

在.bat(批处理文件)中查找和替换导致未知错误的字符串

如何从unix中有两个已知和未知字符串的文件中grep?

将未知长度的字符串与已知长度的字符串进行比较

如何读取长度未知的输入字符串?

生成所有槽数未知的组合

正则表达式具有未知数量参数的字符串