JSON到nifi中的多个JSON对象的数组

时间:2019-02-16 07:34:02

标签: apache-nifi

我想在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 :(得分:2)

您有两个级别的数组。我认为在根数组中您可能有几个对象

[
    {
        "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
}

答案 1 :(得分:1)

您可以在输入JSON的每个项目的.map属性上使用Key函数。

以下内容将为第一个输入值输出所需的结果。然后,您可以遍历每个输入对象。

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