Массив JSON в Mupliple JSON Object в нифи - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу добиться нижеприведенного сценария запрос-ответ в Nifi.Моя цель состоит в том, чтобы использовать каждое значение, поступающее в виде массива (ключ объекта 1, ключ объекта 2, ...) в других процессорах.

Так что, если я смогу преобразовать его в несколько JSON, то, используя раздельный JSON, я смогу использовать несколько вейлов позже.

Пожалуйста, предложите для этого всевозможные решения.

Входной JSON:

[
    { 
         "ID": "789654",
         "Date": "29th Feb",
         "Key" : ["object key 1", "object key 2", "object key 3"....]
    }
]

Выходной JSON:

        [
            { 

             "ID": "789654",

            "Date": "29th Feb",

            "Key1" : "object key 1"

           },

           { 

             "ID": "789654",

            "Date": "29th Feb",

            "Key2" : "object key 2"

           },

          { 

             "ID": "789654",

            "Date": "29th Feb",

            "Key3" : "object key 3"

           },
           .
           .
           .
           .
           .
           .

         ]

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

у вас есть два уровня массива.я предполагаю, что в корневом массиве вы можете иметь несколько объектов

[
    {
        "ID" : "111",
        "Date" : "29th Feb",
        "Key" : ["object key 1", "object key 2", "object key 3", "object key 4"]
    },
    {
        "ID" : "222",
        "Date" : "27th Feb",
        "Key" : ["object key 5", "object key 6"]
    }
]

использовать следующий поток

  • SplitJson - разделить файл по корневому массиву $
  • EvaluateJsonPath - извлекать $.ID и $.Date значения в атрибуты с соответствующими именами
  • SplitJson - разбивать файлы по $.Key
  • ReplaceText - результат предыдущего шага равеннедействительный json, потому что у вас есть массив строк в Key.Вы должны обернуть строку в содержимое двойными кавычками: (?s)(^.*$) -> "$1"
  • EvaluateJsonPath - извлечь строку из контекста $ в атрибут Key
  • AttributesToJson - последний шаг кпостроить JSON из атрибутов

крайне альтернативный вариант

Использовать ExecuteGroovyScript со скриптом:

@Grab(group='acme.groovy', module='acmenifi', version='20190218')
import static groovyx.acme.nifi.AcmeNiFi.*

withFlowFile(this).withJson{json,attr->
    json.each{o1->
        o1.Key.each{k1-> 
            //build new file with json
            newFlowFile(this).withJson{json2,attr2->
                attr2.putAll(attr)
                return o1 + [Key:k1] //set content of new flow file
            }
        }
    }
    return null //drop current file
}
0 голосов
/ 16 февраля 2019

Вы можете использовать функцию .map для свойства Key каждого из элементов входного JSON.

Следующее выведет желаемый результат для первого входного значения.Затем вы можете перебирать каждый из входных объектов.

const result = input[0].Key.map((key) => {return {ID: input[0].ID, Date: input[0].Date, Key: key}});
...