我想在 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"
},
.
.
.
.
.
.
]
最佳答案
你有两层数组。我假设在根数组中你可以有几个对象
[
{
"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
}
关于apache-nifi - JSON 数组到 nifi 中的多个 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54720905/