NiFi使用JsonPathReader/JsonTreeReader转换JSON到CSV失败求助
解决NiFi中JSON转CSV只输出表头的问题
看起来你遇到的核心问题是JSON数据嵌套层级较深,Reader没有正确定位到目标记录数组,也没提取到嵌套字段的值。我来帮你一步步调整配置:
问题根源
你的目标记录都在content.data.erpDataObjects这个数组里,每个记录的number和id又嵌套在head.fields.{field}.value路径下,当前的Reader和Schema配置没有正确映射这些路径。
方案1:使用JsonTreeReader(推荐)
1. 调整Avro Schema
修改你的Schema,通过字段的doc属性指定每个字段对应的JSON路径,让Reader能精准提取值:
{ "type": "record", "name": "ErpRecord", "fields": [ { "name": "number", "type": "string", "doc": "$.head.fields.number.value" }, { "name": "id", "type": "string", "doc": "$.head.fields.id.value" } ] }
2. 配置JsonTreeReader
在Reader的配置界面:
- 设置Root JSON Path为
$.content.data.erpDataObjects,告诉Reader从这个数组开始读取记录 - 开启Treat Array as Multiple Records(设为
true),这样数组里的每个元素都会被当作一条独立记录
方案2:使用JsonPathReader
如果你更习惯用JsonPath来定位:
1. 配置JsonPathReader
- Json Path Expression设置为
$.content.data.erpDataObjects[*],[*]表示选中数组里的所有元素,每个元素对应一条记录 - 在Field Mapping部分添加两个映射:
- 目标字段
number对应JSON路径$.head.fields.number.value - 目标字段
id对应JSON路径$.head.fields.id.value
- 目标字段
2. 关联Schema(可选)
如果需要用AvroSchemaRegistry,Schema可以和方案1里的保持一致,确保字段名和类型匹配。
最后检查ConvertRecord和Writer
- 确保CSVRecordSetWriter的Include Header Line设为
true,字段顺序和Schema/映射一致 - 确认ConvertRecord的Reader和Writer都正确关联了对应的配置和Schema
你可以先用EvaluateJsonPath处理器测试一下路径是否正确,比如提取$.content.data.erpDataObjects,看看能不能得到多个元素,这样能快速验证路径是否正确。
内容的提问来源于stack exchange,提问作者Corni
相关产品推荐
相关产品推荐

