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