使用JOLT将复杂嵌套JSON转换为扁平JSON的技术求助
多层数组JSON转扁平JSON的JOLT解决方案
输入JSON
{ "data": [ { "id": "1", "name": "A", "details": [ { "type": "X", "values": [1,2,3] }, { "type": "Y", "values": [4,5,6] } ] }, { "id": "2", "name": "B", "details": [ { "type": "Z", "values": [7,8,9] } ] } ] }
现有JOLT转换代码
[ { "operation": "shift", "spec": { "data": { "*": { "details": { "*": { "values": { "*": { "@(4,id)": "id", "@(4,name)": "name", "@(2,type)": "type", "@": "value" } } } } } } } } ]
期望目标输出(9行数据)
[ {"id":"1","name":"A","type":"X","value":1}, {"id":"1","name":"A","type":"X","value":2}, {"id":"1","name":"A","type":"X","value":3}, {"id":"1","name":"A","type":"Y","value":4}, {"id":"1","name":"A","type":"Y","value":5}, {"id":"1","name":"A","type":"Y","value":6}, {"id":"2","name":"B","type":"Z","value":7}, {"id":"2","name":"B","type":"Z","value":8}, {"id":"2","name":"B","type":"Z","value":9} ]
正确JOLT转换方案
[ { "operation": "shift", "spec": { "data": { "*": { "id": "&1.id", "name": "&1.name", "details": "&1.details" } } } }, { "operation": "shift", "spec": { "*": { "details": { "*": { "@(2,id)": "&3.&1.id", "@(2,name)": "&3.&1.name", "type": "&3.&1.type", "values": "&3.&1.values" } } } } }, { "operation": "shift", "spec": { "*": { "*": { "values": { "*": { "@(2,id)": "[&3].id", "@(2,name)": "[&3].name", "@(2,type)": "[&3].type", "@": "[&3].value" } } } } } }, { "operation": "shift", "spec": { "*": "[]" } } ]
转换逻辑说明
- 第一层Shift:拆分
data数组的每个元素,保留id、name并关联到对应索引节点,同时传递details数组,为后续层级展开做铺垫。 - 第二层Shift:展开
details数组,将上层的id、name映射到每个details元素节点上,确保层级关联不丢失。 - 第三层Shift:展开
values数组,将每个数值与对应的id、name、type组合成扁平对象,通过[&3]索引标记每个对象的数组位置,保证最终生成9条独立数据。 - 第四层Shift:将分散的对象节点合并为一个统一的数组,输出符合要求的扁平JSON结构。
内容的提问来源于stack exchange,提问作者Gowtham A
相关产品推荐
相关产品推荐

