如何使用JSON Jolt转换记录:展开列表并保留索引对应关系
Jolt转换:按索引映射列表元素生成对应记录
需要将指定JSON转换为多条记录,展开列表时保持各列表元素的索引一一对应,同时保留非列表属性。
原始输入JSON
{ "id": "test", "name": "John", "number": [ 1, 2, 3 ], "letter": [ "a", "b", "c" ] }
尝试的Jolt规则(无效)
[ { "operation": "shift", "spec": { "@": "[]" } }, { "operation": "shift", "spec": { "*": { "number": { "*": { "@2,id": "&3.&1.id", "@2,name": "&3.&1.name", "@2,letter": "&3.&1.letter", "@": "&3.&1.&2" } } } } }, { "operation": "shift", "spec": { "*": { "*": "" } } }, { "operation": "shift", "spec": { "*": { "letter": { "*": { "@2,id": "&3.&1.id", "@2,name": "&3.&1.name", "@2,number": "&3.&1.number", "@": "&3.&1.&2" } } } } }, { "operation": "shift", "spec": { "*": { "*": "" } } } ]
当前错误输出
[ { "id": "test", "name": "John", "number": 1, "letter": "a" }, { "id": "test", "name": "John", "number": 1, "letter": "b" }, { "id": "test", "name": "John", "number": 1, "letter": "c" }, { "id": "test", "name": "John", "number": 2, "letter": "a" }, { "id": "test", "name": "John", "number": 2, "letter": "b" }, { "id": "test", "name": "John", "number": 2, "letter": "c" }, { "id": "test", "name": "John", "number": 3, "letter": "a" }, { "id": "test", "name": "John", "number": 3, "letter": "b" }, { "id": "test", "name": "John", "number": 3, "letter": "c" } ]
期望输出
[ { "id": "test", "name": "John", "number": 1, "letter": "a" }, { "id": "test", "name": "John", "number": 2, "letter": "b" }, { "id": "test", "name": "John", "number": 3, "letter": "c" } ]
正确的Jolt转换规则
[ { "operation": "shift", "spec": { "id": "[&1].id", "name": "[&1].name", "number": { "*": { "@": "[&1].number", "@2,letter[&1]": "[&1].letter" } } } }, { "operation": "shift", "spec": { "*": "[]" } } ]
规则解释
- 第一个shift操作:
- 将
id和name绑定到每个索引位置的对象中,[&1]对应后续列表的索引,确保非列表属性能和每条记录关联 - 遍历
number列表的每个元素,*代表当前元素的索引;将当前number值放入对应索引的number字段,同时通过@2,letter[&1]获取同索引的letter值,放入对应位置的letter字段
- 将
- 第二个shift操作:
- 将按索引分组的对象转换为数组形式,得到最终的一对一映射记录列表
内容的提问来源于stack exchange,提问作者Coding Help
相关产品推荐
相关产品推荐

