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