Я ищу способ динамического обновления заданных значений и ключей Json. Способ доставки Json всегда один и тот же (с точки зрения структуры). Единственное, что отличается, - это объем предоставляемых данных. Так, например, иногда может быть 30, иногда только 10 гнезд и т. д.
…
"ampdata": [
{
"nr": "303",
"code": "JGJGh4958GH",
"status": "AVAILABLE",
"ability": [ "" ],
"type": "wheeled",
"conns": [
{
"nr": "447",
"status": "",
"version": "3",
"format": "sckt",
"amp": "32",
"vol": "400",
"vpower": 22
}
]
}
Поскольку Json использует другие ключи / значения, чем я в моей БД, мне нужно их преобразовать. Кроме того, мне нужно изменить некоторые значения, если они соответствуют явным строкам.
Так, например: "Code" должен быть переименован в "adrID", а "sckt" должен соответствовать значениям "bike".
Я попробовал простой Groovy-Script, чтобы удалить ключ и / или изменить значение. Проблема не в изменении значений, а в изменении самого ключа. Поэтому я попытался удалить ключ и добавить новый. К сожалению, я не мог понять, как добавить новый ключ: значение к данному json. Итак, как я могу добавить новую пару ключ: значение или переименовать ключ, если это возможно. Взгляните на мой пример кода
def flowFile = session.get()
if (!flowFile) return
try {
flowFile = session.write(flowFile,
{ inputStream, outputStream ->
def text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
def obj = new JsonSlurper().parseText(text)
def objBuilder = new JsonBuilder(obj)
// Update ingestionDate field with today's date
for(i in 0..obj.data.size()-1){
obj.data[0].remove("postal_code")
objBuilder.data[0].postal_code=5
}
// Output updated JSON
def json = JsonOutput.toJson(obj)
outputStream.write(JsonOutput.prettyPrint(json).getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
flowFile = session.putAttribute(flowFile, "filename", flowFile.getAttribute('filename').tokenize('.')[0]+'_translated.json')
session.transfer(flowFile, REL_SUCCESS)
} catch(Exception e) {
log.error('Error during JSON operations', e)
session.transfer(flowFile, REL_FAILURE)
}
Я попробовал простой Groovy-Script, чтобы удалить ключ и / или изменить значение. Проблема не в изменении значений, а в изменении самого ключа. Поэтому я попытался удалить ключ и добавить новый. К сожалению, я не мог понять, как добавить новый ключ: значение к данному json. Итак, как я могу добавить новую пару ключ: значение или переименовать ключ, если это возможно. Взгляните на мой пример кода

...
def obj = new JsonSlurper().parse(inputStream, "UTF-8")
obj.data.each{e->
def value = e.remove("postal_code")
//set old value with a new key into object
e["postalCode"] = value
}
//write to output
def builder = new JsonBuilder(obj)
outputStream.withWriter("UTF-8"){ it << builder.toPrettyString() }
Я попытался использовать ваш ответ, но столкнулся с несколькими новыми проблемами. Мой код выглядит следующим образом: flowFile = session.write(flowFile, { inputStream, outputStream -> def text = IOUtils.toString(inputStream, StandardCharsets.UTF_8) def obj = new JsonSlurper().parseText(text) // Update ingestionDate field with today's date obj.data.each{e-> def value = obj.data[0].remove("postal_code") obj.data[0].name = value //set old value with a new key into object e["postalCode"] = value } Проблема: postalCode не создается, а "value" показывает "null"
ps: удаление прошло успешно, я просто не мог понять, как удалить и обновить ключ / значение. мой результат остается таким же, как показано выше, так как я не мог заставить его работать с вашей версией.
что ты уже испробовал? каков твой вопрос? пожалуйста, предоставьте примеры ввода и вывода json ....