Nifi - 属于json - 无法从属性生成所需的json

时间:2018-05-18 15:47:19

标签: apache-nifi

流文件内容为

  

{       " resourceType":"患者",       " myArray":[1,2,3,4]   }

我使用EvaluateJsonPath处理器加载" myArray"对于atAririute myArray。

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

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

  

{" myArray的":" [1,2,3,4]"}

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

  

{" myArray的":[1,2,3,4]}

以下是flowfile属性 enter image description here 我怎样才能得到" myArray"在内容中再次作为数组?

2 个答案:

答案 0 :(得分:2)

使用面向记录的处理器,例如转换记录处理器,而不是使用EvaluateJsonPath,AttributesToJSON处理器。

RecordReader为JsonPathReader

JsonPathReader配置: Path reader

<强> 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 处理器。

ReplaceText配置: enter image description here

答案 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"]}

使用 replace_text_processor_2

然后用JOLT做进一步的处理(这就是为什么Sol 1总是有意义的)

希望这会有所帮助,花了大约半天时间找出第二个解决方案,并被在 Nifi 方面更有经验的人指出了解决方案 1