Apache Nifi управляет вложенным json с помощью Execute Script

Я ищу способ динамического обновления заданных значений и ключей 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)
}

что ты уже испробовал? каков твой вопрос? пожалуйста, предоставьте примеры ввода и вывода json ....

daggett 21.11.2018 14:23

Я попробовал простой Groovy-Script, чтобы удалить ключ и / или изменить значение. Проблема не в изменении значений, а в изменении самого ключа. Поэтому я попытался удалить ключ и добавить новый. К сожалению, я не мог понять, как добавить новый ключ: значение к данному json. Итак, как я могу добавить новую пару ключ: значение или переименовать ключ, если это возможно. Взгляните на мой пример кода

Steve 21.11.2018 16:37
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
490
1

Ответы 1

...
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"

Steve 22.11.2018 09:56

ps: удаление прошло успешно, я просто не мог понять, как удалить и обновить ключ / значение. мой результат остается таким же, как показано выше, так как я не мог заставить его работать с вашей версией.

Steve 22.11.2018 09:58

Другие вопросы по теме