Groovy Jsonslurper编辑数组中的值

时间:2018-11-14 08:32:41

标签: json groovy

我搜索并尝试了很多方法来解决我的问题。但是似乎没有任何效果。也许我只是理解错了。我有一个看起来像这样的test.json文件。

{
    "TEST-A":             [{ "app_id":"aaa" }],
    "TEST-B":              [{ "app_id":"bbb" }],
    "TEST-C":          [{ "app_id":"ccc" }]
}

现在我想用“ xxx”编辑TEST-B。例如,我在尝试ist:

import groovy.json.JsonSlurper

def slurper = new groovy.json.JsonSlurper()
def inputFile = new File("../config/test.json")
def inputJSON = new JsonSlurper().parseText(inputFile.text)
def builder = new JsonBuilder(inputJSON)

builder.content.TEST-B[0] = 'xxx'

我认为我已经可以编辑地图了,还是需要使用“断言”?

问候霜。

1 个答案:

答案 0 :(得分:1)

以下代码:

import groovy.json.*

def data = '''\
{
    "TEST-A":   [{ "app_id":"aaa" }],
    "TEST-B":   [{ "app_id":"bbb" }],
    "TEST-C":   [{ "app_id":"ccc" }]
}'''

def parsed = new JsonSlurper().parseText(data)
println "parsed is a java.util.Map: ${parsed instanceof Map}"

parsed.'TEST-B'[0].app_id = 'xxx'

println "map after change: $parsed"

def result = JsonOutput.toJson(parsed)
println "result is a String: ${result instanceof String}"

println "result: $result"
println "pretty result:\n${JsonOutput.prettyPrint(result)}"

运行时,打印出:

~> groovy test.groovy
parsed is a java.util.Map: true
map after change: [TEST-A:[[app_id:aaa]], TEST-B:[[app_id:xxx]], TEST-C:[[app_id:ccc]]]
result is a String: true
result: {"TEST-A":[{"app_id":"aaa"}],"TEST-B":[{"app_id":"xxx"}],"TEST-C":[{"app_id":"ccc"}]}
pretty result:
{
    "TEST-A": [
        {
            "app_id": "aaa"
        }
    ],
    "TEST-B": [
        {
            "app_id": "xxx"
        }
    ],
    "TEST-C": [
        {
            "app_id": "ccc"
        }
    ]
}

,我相信您已尽力做到了。关于JsonSlurper的事情,是要在解析了数据输入之后,您得到的是一个普通的java.util.Map(或者可能是java.util.List,具体取决于数据输入json)。

换句话说,上面的parsed变量只是一个Map,其中键是字符串,而值是Maps列表。

要记住的第二件事是,TEST-B之类的键在Groovy中不是有效的标识符,因此您不能只写parsed.TEST-B,因为它将被解释为parsed.TEST {{1 }} -,因此您必须用特殊字符引号。

更改地图并假定要返回json表示形式后,必须使用上面的代码中的JsonOutput之类的东西。