JOLT转换错误排查:保留顶层字段生成目标数组结构
JOLT转换问题:将顶层字段合并到数组元素中
输入JSON
{ "found": true, "consultado": "00000000", "nome": "EMPRESA DE CNPJ 00000000 LTDA", "participacaoEmpresa": [ { "cnpj": "44444444", "nome": "EMPRESA DE CNPJ 44444444 LTDA", "descricaoCargo": "Sócio" }, { "cnpj": "123", "nome": "EMPRESA DE CNPJ 123 LTDA", "descricaoCargo": "Sócio123" } ] }
原JOLT规则
[ { "operation": "shift", "spec": { "consultado": "DOCT_SCIO", "nome": "NOME_SCIO", "participacaoEmpresa": { "*": { "cnpj": "CNPJ_PSSA_JUDC", "nome": "NOME_PSSA_JUDC", "descricaoCargo": "DCRC_CRGO" } } } }, { "operation": "shift", "spec": { "*_PSSA*|DCRC_CRGO": { "*": { "@": "[&1].&2" } } } } ]
当前错误输出
[ { "DCRC_CRGO": "Sócio", "CNPJ_PSSA_JUDC": "44444444", "NOME_PSSA_JUDC": "EMPRESA DE CNPJ 44444444 LTDA" }, { "DCRC_CRGO": "Sócio123", "CNPJ_PSSA_JUDC": "123", "NOME_PSSA_JUDC": "EMPRESA DE CNPJ 123 LTDA" } ]
期望输出
[ { "DOCT_SCIO": "00000000", "NOME_SCIO": "EMPRESA DE CNPJ 00000000 LTDA", "DCRC_CRGO": "Sócio", "CNPJ_PSSA_JUDC": "44444444", "NOME_PSSA_JUDC": "EMPRESA DE CNPJ 44444444 LTDA" }, { "DOCT_SCIO": "00000000", "NOME_SCIO": "EMPRESA DE CNPJ 00000000 LTDA", "DCRC_CRGO": "Sócio123", "CNPJ_PSSA_JUDC": "123", "NOME_PSSA_JUDC": "EMPRESA DE CNPJ 123 LTDA" } ]
错误原因
原规则的第二个shift操作仅匹配*_PSSA*和DCRC_CRGO字段,完全忽略了顶层的DOCT_SCIO和NOME_SCIO,导致这两个字段被直接丢弃,没有被合并到最终的数组元素中。
修改后的JOLT规则
[ { "operation": "shift", "spec": { "consultado": "DOCT_SCIO", "nome": "NOME_SCIO", "participacaoEmpresa": { "*": { "cnpj": "CNPJ_PSSA_JUDC", "nome": "NOME_PSSA_JUDC", "descricaoCargo": "DCRC_CRGO" } } } }, { "operation": "shift", "spec": { "DOCT_SCIO": { "@": "[*].DOCT_SCIO" }, "NOME_SCIO": { "@": "[*].NOME_SCIO" }, "*_PSSA*|DCRC_CRGO": { "*": { "@": "[&1].&2" } } } } ]
分步解析
第一个Shift操作:
- 映射顶层字段:将
consultado转为DOCT_SCIO,nome转为NOME_SCIO,这两个字段为单值。 - 处理数组:遍历
participacaoEmpresa的每个元素(*匹配数组索引),将每个元素的子字段映射为CNPJ_PSSA_JUDC、NOME_PSSA_JUDC、DCRC_CRGO,由于数组有2个元素,这三个字段会生成长度为2的数组。
中间输出如下:
{ "DOCT_SCIO": "00000000", "NOME_SCIO": "EMPRESA DE CNPJ 00000000 LTDA", "CNPJ_PSSA_JUDC": ["44444444", "123"], "NOME_PSSA_JUDC": ["EMPRESA DE CNPJ 44444444 LTDA", "EMPRESA DE CNPJ 123 LTDA"], "DCRC_CRGO": ["Sócio", "Sócio123"] }- 映射顶层字段:将
第二个Shift操作:
- 复制顶层字段到数组元素:使用
[*]通配符,将DOCT_SCIO和NOME_SCIO的单值复制到数组的每个索引位置([0]和[1])对应的对象中,保持字段名不变。 - 映射数组字段到对象:遍历
*_PSSA*和DCRC_CRGO的数组元素(*匹配索引),通过[&1].&2将值放到对应索引的对象里,其中&1代表当前数组的索引,&2代表原字段名。
最终输出即为期望的结构,每个数组元素都包含所有字段。
- 复制顶层字段到数组元素:使用
内容的提问来源于stack exchange,提问作者Mateus Costa Luz
相关产品推荐
相关产品推荐

