Jolt转换嵌套数组JSON时子数组元素错乱问题求助
Jolt嵌套数组转换元素混淆问题修正方案
问题说明
作为Jolt新手,处理包含嵌套数组的JSON转换时,发现父级的子数组times元素出现跨父级混淆:id为1的对象混入了id为2的times元素,id为2的对象混入了id为1的times元素,预期每个父级对象的timing数组应仅包含自身opening数组对应的元素。
输入JSON
[ { "id": "1", "name": "data1", "opening": [ { "From": "07:30:01", "To": "17:30:01" }, { "From": "07:30:02", "To": "17:30:02" } ] }, { "id": "2", "name": "data2", "opening": [ { "From": "07:30:03", "To": "17:30:03" }, { "From": "07:30:04", "To": "17:30:04" } ] } ]
原Jolt转换规则
[ { "operation": "shift", "spec": { "*": { "id": "[&1].id", "name": "[&1].name", "opening": { "*": { "From": "[&1].timing.[&3].times[0].from", "To": "[&1].timing.[&3].times[0].to" } } } } } ]
预期输出
[ { "id" : "1", "name" : "data1", "timing" : [ { "times" : [ { "from" : "07:30:01", "to" : "17:30:01" } ] }, { "times" : [ { "from" : "07:30:02", "to" : "17:30:02" } ] } ] }, { "timing" : [ { "times" : [ { "from" : "07:30:03", "to" : "17:30:03" } ] }, { "times" : [ { "from" : "07:30:04", "to" : "17:30:04" } ] } ], "id" : "2", "name" : "data2" } ]
当前错误输出
[ { "id" : "1", "name" : "data1", "timing" : [ { "times" : [ { "from" : "07:30:01", "to" : "17:30:01" } ] }, { "times" : [ { "from" : "07:30:03", "to" : "17:30:03" } ] } ] }, { "timing" : [ { "times" : [ { "from" : "07:30:02", "to" : "17:30:02" } ] }, { "times" : [ { "from" : "07:30:04", "to" : "17:30:04" } ] } ], "id" : "2", "name" : "data2" } ]
修正方案
错误原因
原规则中From和To的路径使用了错误的层级引用:[&1].timing.[&3]把当前opening元素的索引当作了父数组的索引,把父元素的索引当作了timing数组的索引,导致不同父级的opening元素被错误映射到其他父级的timing数组中。
修正后的Jolt规则
[ { "operation": "shift", "spec": { "*": { "id": "[&1].id", "name": "[&1].name", "opening": { "*": { "From": "[&3].timing.[&1].times[0].from", "To": "[&3].timing.[&1].times[0].to" } } } } } ]
规则解释
[&3]:在opening的子元素层级,引用最外层父元素的索引,确保每个父级对象的属性被映射到自身数组位置[&1]:引用当前opening数组元素的索引,确保每个opening元素被映射到当前父级timing数组的对应位置
这样每个父级对象的opening数组元素会被正确映射到自身的timing数组中,不会出现跨父级混淆。
内容的提问来源于stack exchange,提问作者dawood
相关产品推荐
相关产品推荐

