我想在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"
},
.
.
.
.
.
.
]
答案 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"]
}
]
使用以下流程
$
拆分文件$.ID
和$.Date
值提取到具有相应名称的属性中$.Key
分割文件Key
中有一个字符串数组。您必须使用双引号将字符串包装在内容中:(?s)(^.*$)
-> "$1"
$
中的字符串提取到Key
属性中极端替代变体
在脚本中使用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}});