JOLT转换JSON数组未得预期扁平化结果,求修正规范
JOLT数组扁平化转换问题修正
输入JSON
{ "object": { "settings": [ { "key": { "id": 1 }, "rec": { "value": "value 1" } }, { "key": { "id": 2 }, "rec": { "value": "value 2" } }, { "key": { "id": 3 }, "rec": { "value": "value 3" } } ], "customer": [ { "key": { "id": 4 }, "rec": { "address": "some address" } } ] }, "date": "2024" }
预期输出
[ { "date" : "2024", "id" : 4, "address" : "some address" }, { "date" : "2024", "id" : 1, "value" : "value 1" }, { "date" : "2024", "id" : 2, "value" : "value 2" }, { "date" : "2024", "id" : 3, "value" : "value 3" } ]
问题分析
原JOLT规范的问题在于第一个shift操作中,给customer和settings的元素分别指定了[&1].[0]和[&1].[1]的嵌套结构,导致customer[0]和settings[0]被合并到同一个子数组中,最终输出出现嵌套数组,不符合扁平化要求。
修正后的JOLT规范
[ { "operation": "shift", "spec": { "date": "date", "object": { "*": { "*": { "@2,date": "[&1].date", "key": { "id": "[&2].id" }, "rec": { "*": "[&3].&" } } } } } }, { "operation": "shift", "spec": { "*": { "@": "[]" } } } ]
规范说明
- 第一个
shift操作:- 暂存顶层的
date字段; - 遍历
object下的所有子数组(customer和settings); - 对每个数组元素,提取顶层
date、key.id以及rec下的所有字段(自动匹配address或value),将这些字段组合为独立对象按原数组索引暂存。
- 暂存顶层的
- 第二个
shift操作:- 将暂存的所有对象统一放入一个新数组,实现完全扁平化。
验证结果
使用修正后的规范处理输入JSON,将得到与预期一致的扁平化数组输出。
内容的提问来源于stack exchange,提问作者AmiTLT
相关产品推荐
相关产品推荐

