如何从嵌套JSON中提取精准数据?已尝试SplitJson和EvaluateJson处理器未果
解决NiFi SplitJson和EvaluateJson提取嵌套JSON数据的问题
我明白你在处理这个多层嵌套JSON时遇到的麻烦了——这种对象套对象的结构确实容易在配置JsonPath时踩坑,我来一步步帮你搞定。
先理清楚你的JSON核心结构:
{ "affiliate": { "name": "affiliate", "apiLists": { "category1": { /* 分类1的API数据 */ }, "category2": { /* 分类2的API数据 */ } } } }
apiLists是一个对象(不是数组),里面的每个键(比如category1)对应一个分类的完整数据,每个分类下又有availableVariants对象,包含多个版本的API配置。
步骤1:用SplitJson拆分每个分类(category)
首先我们需要把apiLists下的每个分类拆成单独的流文件,这样后续处理更灵活:
- 配置SplitJson处理器:
- JsonPath Expression:
$.affiliate.apiLists.*
这个表达式的意思是:取affiliate.apiLists下的所有子对象(不管键名是什么)。
- JsonPath Expression:
拆分后,每个流文件的内容会是单个分类的完整数据,比如category1的内容:
{ "availableVariants": { "v1.1.0": { "resourceName": "category1", "put": null, "delete": null, "post": null }, "v0.1.0": { "resourceName": "category1", "put": null, "delete": null } }, "apiName": "category1" }
同时,NiFi会自动给每个流文件添加split.key属性,值就是原对象的键(比如category1),这个属性后面可以直接引用。
步骤2:(可选)拆分每个版本的API信息
如果需要把每个版本(比如v1.1.0、v0.1.0)也拆成单独的流文件,再添加一个SplitJson处理器:
- JsonPath Expression:
$.availableVariants.*
拆分后,每个流文件就是单个版本的API数据:
{ "resourceName": "category1", "put": null, "delete": null, "post": null }
同样,NiFi会添加split.key属性,值就是版本号(比如v1.1.0)。
步骤3:用EvaluateJson提取目标字段
现在可以用EvaluateJson处理器提取你需要的具体数据了,举几个常用配置示例:
场景1:提取分类级别的数据(未拆分版本时)
针对步骤1拆分后的分类流文件,添加以下属性:
- Property Name:
apiName,JsonPath Expression:$.apiName - Property Name:
allVersions,JsonPath Expression:$.availableVariants.*(会返回所有版本的数组)
场景2:提取单个版本的详细数据(拆分版本后)
针对步骤2拆分后的版本流文件,添加以下属性:
- Property Name:
resourceName,JsonPath Expression:$.resourceName - Property Name:
putMethod,JsonPath Expression:$.put - Property Name:
apiVersion,Value:${split.key}(直接引用SplitJson生成的版本号属性) - Property Name:
categoryName,Value:${split.key}(这里的split.key是上一级SplitJson生成的分类名,需要确保属性传递正确)
排查小技巧
如果还是拿不到数据,可以用LogAttribute处理器查看流文件的内容和属性,确认:
- SplitJson是否正确拆分了流文件(看
content字段) split.key等自动生成的属性是否存在- JsonPath表达式是否匹配当前流文件的结构(可以用本地或在线JsonPath测试工具先验证表达式)
内容的提问来源于stack exchange,提问作者Umang
相关产品推荐
相关产品推荐

