Nifi - json 的属性 - 无法从属性生成所需的 json
Nifi - atttributes to json - not able to generate the required json from an attribute
流文件内容为
{
"resourceType": "Patient",
"myArray": [1, 2, 3, 4]
}
我使用 EvaluateJsonPath 处理器将 "myArray" 加载到属性 myArray。
然后我使用处理器 AttributesToJSON 从 myArray 创建一个 json。
但是在流文件内容中,我得到的是
{"myArray":"[1,2,3,4]"}
我希望流文件具有以下内容。
{"myArray":[1,2,3,4]}
这是流文件的属性
如何在内容中再次将 "myArray" 作为数组获取?
使用面向记录的处理器,例如 Convert Record 处理器,而不是使用 EvaluateJsonPath、AttributesToJSON 处理器。
RecordReader 作为 JsonPathReader
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 link如何配置ConvertRecord处理器
(或)
如果你应得的输出是 {"myArray":[1,2,3,4]}
而没有 [](array)
然后使用
ReplaceText 处理器而不是 AttributesToJson 处理器。
ReplaceText 配置:
并不是所有的功劳都归于我,但我被指出了一种更好更简单的方法来实现这一目标。有2种方法。
解决方案1 - 最简单优雅
使用 Nifi JoltTransformJSON 处理器。处理器可以在规范语法的左侧或右侧使用 Nifi 表达式语言和属性。这允许您快速使用 JOLT 默认规范将新字段(从流文件属性)添加到新的或现有的 JSON.
例如:
{"customer_id": 1234567, "vckey_list": ["test value"]}
作为 EvaluateJSONPath 操作的结果,这两个字段值都存储在流文件属性中。假设“customer_id_attr”和“vckey_list_attr”。我们可以使用“默认”颠簸规范和正确的语法从这些流文件属性中简单地生成一个新的 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、from
中的新密钥正确格式化
{"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"]}
正在使用
replace_text_processor_2
然后使用 JOLT 做进一步处理(这就是为什么 Sol 1 总是有意义的)
希望这会有所帮助,花了大约半天的时间找出第二个解决方案,并被对 Nifi 有更多经验的人指出了解决方案 1
流文件内容为
{ "resourceType": "Patient", "myArray": [1, 2, 3, 4] }
我使用 EvaluateJsonPath 处理器将 "myArray" 加载到属性 myArray。
但是在流文件内容中,我得到的是
{"myArray":"[1,2,3,4]"}
我希望流文件具有以下内容。
{"myArray":[1,2,3,4]}
这是流文件的属性
使用面向记录的处理器,例如 Convert Record 处理器,而不是使用 EvaluateJsonPath、AttributesToJSON 处理器。
RecordReader 作为 JsonPathReader
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 link如何配置ConvertRecord处理器
(或)
如果你应得的输出是 {"myArray":[1,2,3,4]}
而没有 [](array)
然后使用
ReplaceText 处理器而不是 AttributesToJson 处理器。
ReplaceText 配置:
并不是所有的功劳都归于我,但我被指出了一种更好更简单的方法来实现这一目标。有2种方法。
解决方案1 - 最简单优雅 使用 Nifi JoltTransformJSON 处理器。处理器可以在规范语法的左侧或右侧使用 Nifi 表达式语言和属性。这允许您快速使用 JOLT 默认规范将新字段(从流文件属性)添加到新的或现有的 JSON.
例如:
{"customer_id": 1234567, "vckey_list": ["test value"]}
作为 EvaluateJSONPath 操作的结果,这两个字段值都存储在流文件属性中。假设“customer_id_attr”和“vckey_list_attr”。我们可以使用“默认”颠簸规范和正确的语法从这些流文件属性中简单地生成一个新的 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、from
中的新密钥正确格式化{"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"]}
正在使用 replace_text_processor_2
然后使用 JOLT 做进一步处理(这就是为什么 Sol 1 总是有意义的)
希望这会有所帮助,花了大约半天的时间找出第二个解决方案,并被对 Nifi 有更多经验的人指出了解决方案 1