如何使用 QueryRecord 从 JSON 对象中提取字段

How to extract the field from JSON object with QueryRecord

这个问题困扰我很久了。我需要通过从输入 JSON 字段 refs[=31= 获取数组(字段 ref)来使用 QueryRecord 创建一个新的 JSON 流文件] 和 跳过 对象字段,如下例所示:

输入JSON流文件

{
    "name": "name1",
    "desc": "full1",
    "refs": {
        "ref": [
            {
                "source": "source1",
                "url": "url1"
            },
            {
                "source": "source2",
                "url": "url2"
            }
        ]
    }
}

查询记录配置

JSONTreeReader 设置为 Infer Schema 和 JSONRecordSetWriter

select name, description, (array[rpath(refs, '//ref[*]')]) as sources from flowfile

输出JSON(需要)

{
    "name": "name1",
    "desc": "full1",
    "references": [
         {
             "source": "source1",
             "url": "url1"
         },
         {
             "source": "source2",
             "url": "url2"
         }
    ]
}

但出现错误: QueryRecord Failed to write MapRecord[{references=[Ljava.lang.Object;@27fd935f, description=full1, name=name1}] with schema ["name" : "STRING", "description" : "STRING", "references" : "ARRAY[STRING]"] as a JSON Object due to java.lang.ClassCastException: null

尝试以下方法,在您的情况下它应该有效:

1) 完整阅读你的 JSON 字段(我用你的例子用 GenerateFlowFile 处理器模仿了它)

2) 添加 EvaluateJsonPath 处理器,它将 2 header 字段 (name, desc) 放入属性中:

3) 添加 SplitJson 处理器,它将把你的 JSON 按 refs/ref/ 组拆分(按“$.refs.ref”拆分):

4) 添加 ReplaceText 处理器,它会将 header 字段(名称、描述)添加到拆分行(将“[{]”值替换为“{"name":”${json.name}","desc":"${json.desc}","):

5) 完成:

我的演示案例中的完整过程:

希望对您有所帮助。

解决方案!:使用JoltTransformJSON通过Jolt规范转换JSON。 About this 规范。