在Apache NiFi中提取JSON数组内numeroNota值的方法
如何从指定JSON中提取
numeroNota值(使用EvaluateJsonPath或其他处理器) 目标JSON结构
{ "documentos": [ { "valorNota": 229.2, "tipoDocumento": "PRE_NOTA_FISCAL", "cnpjEmissorNota": "02130525000177", "cnpjRemetente": "02130525000177", "cnpjUnidade": "02130525000177", "cnpjDestinatario": "14586674000124", "valorFreteRealizadoNota": 0, "serie": "1", "valorFreteCalculadoNota": 1000, "tipoOperacao": "SAIDA", "dataEmissao": "2022-12-05 11:03:00", "numeroNota": 744659 } ], "dataEmissaoConhecimento": "2022-12-05 11:03:00.0", "localizacaoDestinoConhecimento": 3002171, "localizacaoOrigemConhecimento": 3001956, "cepOrigemConhecimento": 44079006, "cepDestinoConhecimento": 48880000, "valorFreteRealizadoConhecimento": 0, "oidConhecimento": 10802880097, "valorFreteCalculadoConhecimento": 1000 }
方法1:使用EvaluateJsonPath处理器
这是最直接的方式,步骤如下:
- 将
EvaluateJsonPath处理器添加到NiFi流程中 - 配置核心参数:
- Destination:选择值的存放位置,可选
flowfile attribute(存为流文件属性)或flowfile content(替换流文件内容) - JsonPath Expression:输入对应表达式:
- 提取数组中第一个元素的
numeroNota:$.documentos[0].numeroNota - 若
documentos有多个元素,提取所有numeroNota组成数组:$.documentos[*].numeroNota
- 提取数组中第一个元素的
- Destination:选择值的存放位置,可选
- 运行流程即可得到目标值
方法2:使用Jolt TransformJSON处理器
适合需要灵活转换JSON结构的场景:
- 添加
Jolt TransformJSON处理器 - 在Jolt Specification中输入规则(提取第一个
numeroNota):
[ { "operation": "shift", "spec": { "documentos": { "0": { "numeroNota": "numeroNota" } } } } ]
若要提取所有documentos中的numeroNota,将规则中的"0"改为"*"即可
方法3:使用ExecuteScript处理器(Groovy脚本)
实现自定义提取逻辑:
- 添加
ExecuteScript处理器,选择脚本语言为Groovy - 输入以下脚本:
import groovy.json.JsonSlurper def flowFile = session.get() if (!flowFile) return def jsonContent = flowFile.read().getText() def jsonObj = new JsonSlurper().parseText(jsonContent) // 提取第一个documento的numeroNota,存为流文件属性 def targetValue = jsonObj.documentos[0].numeroNota flowFile.setAttribute('extracted_numeroNota', targetValue.toString()) session.transfer(flowFile, REL_SUCCESS)
运行后,流文件会新增extracted_numeroNota属性,值为目标数字
内容的提问来源于stack exchange,提问作者Rodrigo Hajime Himauari
相关产品推荐
相关产品推荐

