Groovy Jsonslurper редактировать значение в массиве - PullRequest
0 голосов
/ 14 ноября 2018

Я искал и пробовал много вещей, чтобы решить мою проблему.Но, похоже, ничего не получится.Может я просто неправильно это понимаю.У меня есть файл test.json, который выглядит следующим образом.

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

, и теперь я хочу отредактировать TEST-B с помощью "xxx".Что я пытаюсь, например, 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'

Я думал, что у меня уже есть карта для редактирования, или мне нужно использовать "assert"?

Привет Мороз.

1 Ответ

0 голосов
/ 14 ноября 2018

следующий код:

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, как в коде выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...