Jolt转换问题:将嵌套JSON中每个ms元素的参数名与值分组为子数组
Jolt转换问题:将嵌套JSON中每个ms元素的参数名与值分组为子数组
我手头有个嵌套结构的JSON,想要把ms数组里每个元素对应的参数名和值分别拆分成子数组组成的数组,但目前用的Jolt转换后,paramnames和values是平铺的一维数组,没法按每个ms元素分组。下面是具体的输入、输出情况和当前的Jolt Spec,麻烦帮忙调整下实现期望的效果?
输入JSON
{ "ms": [ { "ts": "2024-02-13T12:43:00.000Z", "ls": { "nr1:name1": { "UE": 0.1, "LE": 3, "TG": 5, "UW": null, "LW": null } }, "ss": { "nr1:name1": [ 5.3 ] } }, { "ts": "2024-02-13T12:43:00.000Z", "ls": { "nr2:name2": { "UE": 0.1, "LE": 0, "TG": 0, "UW": null, "LW": null } }, "ss": { "nr2:name2": [ 0.03 ] } } ] }
当前转换输出(不符合预期)
{ "ts" : [ "2024-02-13T12:43:00.000Z", "2024-02-13T12:43:00.000Z" ], "nrs" : [ "nr1", "nr2" ], "names" : [ "name1", "name2" ], "paramnames" : [ "UE", "LE", "TG", "UW", "LW", "UE", "LE", "TG", "UW", "LW" ], "values" : [ 0.1, 3, 5, null, null, 0.1, 0, 0, null, null ], "act" : [ 5.3, 0.03 ] }
期望输出(修正JSON语法后)
{ "ts": [ "2024-02-13T12:43:00.000Z", "2024-02-13T12:43:00.000Z" ], "nrs" : [ "nr1", "nr2" ], "names" : [ "name1", "name2" ], "paramnames": [ [ "UE", "LE", "TG", "UW", "LW" ], [ "UE", "LE", "TG", "UW", "LW" ] ], "values": [ [ 0.1, 3, 5, null, null ], [ 0.1, 0, 0, null, null ] ], "act": [ 5.3, 0.03 ] }
注:原期望输出里用大括号包裹子数组的写法不符合JSON规范,上面是修正后的合法格式,确保结构为「数组包含子数组」。
当前使用的Jolt Spec
[ { "operation": "shift", "spec": { "ms": { "*": { "ts": "ts", "ls": { "@0": { "*:*": { "$(0,1)": "nrs", "$(0,2)": "names", "*": { "$": "paramnames", "@": "values" } } } }, "ss": { "*:*": { "*": "act" } } } } } } ]
修正后的Jolt Spec
[ { "operation": "shift", "spec": { "ms": { "*": { // 保留ts的数组收集逻辑 "ts": "ts", "ls": { "*:*": { // 收集nrs和names,按ms元素索引对应 "$(0,1)": "nrs", "$(0,2)": "names", // 关键:用&2引用外层ms的数组索引,把当前元素的参数名分组到对应子数组 "*": { "$": "paramnames[&2]", "@": "values[&2]" } } }, "ss": { "*:*": { "*": "act" } } } } } } ]
逻辑解释
- 核心改动是在
paramnames和values的路径里加入了[&2]:&2代表向上回溯2层的索引值,也就是ms数组当前元素的索引(0、1...)- 这样每个
ms元素里的参数名和值都会被收集到对应索引的子数组中,而不是平铺成一维数组
- 去掉了原Spec里多余的
@0层级,直接遍历ls下的*:*键,简化结构 - 其他字段(ts、nrs、names、act)的收集逻辑保持不变,确保原有功能正常
备注:内容来源于stack exchange,提问作者VKB
相关产品推荐
相关产品推荐

