следующий код:
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
выше - это просто карта, где ключи - это строки, а значения - списки карт.
Второе, что нужно иметь в виду, это то, что такие ключи, как TEST-B
, не являются допустимыми идентификаторами в groovy, поэтому вы не можете просто написать parsed.TEST-B
, потому что это будет интерпретировано как parsed.TEST
-
B
, так что вы должны заключать в кавычки ключи со специальными символами, как это.
После того, как вы изменили карту и предположили, что хотите вернуться к представлению json, вы должны использовать что-то вроде JsonOutput, как в коде выше.