Apache nifi Nifi-atttributes to json-无法从属性生成所需的json
流文件内容为 { “资源类型”:“患者”, “myArray”:[1,2,3,4] } 我使用EvaluateJsonPath处理器将“myArray”加载到属性myArray 然后我使用处理器AttributesToJSON从myArray创建一个json。 但在flowfile内容中,我得到的是 {“myArray”:“[1,2,3,4]” 我希望流文件具有以下内容 {“myArray”:[1,2,3,4]} 以下是flowfile属性Apache nifi Nifi-atttributes to json-无法从属性生成所需的json,apache-nifi,Apache Nifi,流文件内容为 { “资源类型”:“患者”, “myArray”:[1,2,3,4] } 我使用EvaluateJsonPath处理器将“myArray”加载到属性myArray 然后我使用处理器AttributesToJSON从myArray创建一个json。 但在flowfile内容中,我得到的是 {“myArray”:“[1,2,3,4]” 我希望流文件具有以下内容 {“myArray”:[1,2,3,4]} 以下是flowfile属性 如何在内容中再次将“myArray”作为数组?使用
如何在内容中再次将“myArray”作为数组?使用面向记录的处理器,如转换记录处理器,而不是使用EvaluateJsonPath、AttributesToJSON处理器 RecordReader作为JsonPathReader JsonPathReader配置: AvroSchemaRegistry:
{
"namespace": "nifi",
"name": "person",
"type": "record",
"fields": [
{ "name": "myArray", "type": {
"type": "array",
"items": "int"
}}
]
}
jsonnetwriter:
使用相同的AvroSchemaRegistry控制器服务访问架构。
要访问AvroSchema,需要为流文件设置schema.name属性
输出流文件内容将是
[{"myArray":[1,2,3,4]}]
请参阅如何配置ConvertRecord处理器的链接
(或)
如果您应得的输出是{“myArray”:[1,2,3,4]}
而不是[](array)
,则使用
ReplaceText处理器,而不是AttributesToJson处理器
ReplaceText配置:
并不是所有的功劳都归我,但我被指出了一种更简单的方法来实现这一点。有两种方法 解决方案1——最简单、最优雅 使用Nifi JoltTransformJSON处理器。处理器可以在规范语法的左侧或右侧使用Nifi表达式语言和属性。这允许您快速使用JOLT默认规范将新字段(来自流文件属性)添加到新的或现有的JSON 例: 作为EvaluateJSONPath操作的结果,这两个字段值都存储在流文件属性中。假设“customer_id_attr”和“vckey_list_attr”。我们可以使用“default”jolt规范和右手语法从这些流文件属性生成一个新的JSON。您甚至可以向处理中添加其他表达式语言函数
[
{
"operation": "default",
"spec": {
"customer_id": ${customer_id_attr},
"vckey_list": ${vckey_list_attr:toLower()}
}
}
]
即使将整个JSON(路径为“$”)存储在一个流文件属性中,这对我来说也是有效的
解决方案2-复杂和丑陋
使用序列Nifi ReplaceText处理器。首先使用ReplaceText处理器将所需的流文件属性附加到文件内容。
如果您正在生成一个全新的JSON,这就可以了。如果您试图修改一个现有的JSON,您需要首先附加所需的键,然后再次使用ReplaceText在现有JSON中正确格式化为新键,从
{"original_json_key": original_json_obj}{"customer_id": 1234567, "vckey_list": ["test value"]}
到
使用
然后使用JOLT进行进一步处理(这就是为什么sol1总是有意义的)
希望这能有所帮助,花了大约半天的时间找出第二个解决方案,并由在Nifi方面有更多经验的人指出解决方案1
{"original_json_key": original_json_obj}{"customer_id": 1234567, "vckey_list": ["test value"]}
{"original_json_key": original_json_obj, "customer_id": 1234567, "vckey_list": ["test value"]}