Apache nifi Nifi-atttributes to json-无法从属性生成所需的json

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”:[1,2,3,4] }

我使用EvaluateJsonPath处理器将“myArray”加载到属性myArray

然后我使用处理器AttributesToJSON从myArray创建一个json。

但在flowfile内容中,我得到的是

{“myArray”:“[1,2,3,4]”

我希望流文件具有以下内容

{“myArray”:[1,2,3,4]}

以下是flowfile属性
如何在内容中再次将“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"]}