如何编写适配单/多objectname的嵌套JSON Jolt Spec?
Jolt转换规则编写需求
需要编写Jolt Spec,将指定嵌套JSON转换为目标输出格式,核心要求是兼容objectname字段的两种情况:既可以包含多个键值对对象,也可以是单个对象。
输入JSON
{ "Status": "Green", "objectname": { "LED TV": { "values": [ [ "one", "two", "three", "four" ], [ 0, 0, 0, "one" ], [ 0, "one", 0, "two" ] ], "time": [ 1663331241000, 1663330155000, 1663328545000 ] }, "LED Bulb": { "values": [ [ "one", "two", "three", "four" ], [ 0, 0, 0, "one" ], [ 0, "one", 0, "two" ] ], "time": [ 1663331241000, 1663330155000, 1663328545000 ] }, "LED LAMP": { "values": [ [ "one", "two", "three", "four" ], [ 0, 0, 0, "one" ], [ 0, "one", 0, "two" ] ], "time": [ 1663331541000, 1663330555000, 1663328545000 ] } }, "Source": "LED EQUIPS" }
预期输出JSON
[ [ "Status", "Green", "objectname", "LED TV", "values", [ "one", "two", "three", "four" ], [ 0, 0, 0, "one" ], [ 0, "one", 0, "two" ] ], [ "Status", "Green", "objectname", "LED Bulb", "values", [ "one", "two", "three", "four" ], [ 0, 0, 0, "one" ], [ 0, "one", 0, "two" ] ], [ "Status", "Green", "objectname", "LED LAMP", "values", [ "one", "two", "three", "four" ], [ 0, 0, 0, "one" ], [ 0, "one", 0, "two" ] ], "Source", "LED EQUIPS" ]
解决方案:Jolt Spec
[ { "operation": "shift", "spec": { "objectname": { "*": { "@2,Status": "[#2].0", "@2,Status": "[#2].1", "'objectname'": "[#2].2", "$": "[#2].3", "'values'": "[#2].4", "values": { "*": "[#4].5&" } } }, "Source": { "$": "[3]", "@": "[4]" } } }, { "operation": "modify-overwrite-beta", "spec": { "0": "=ifElse(IsArray(@0),@0,[@0])" } }, { "operation": "shift", "spec": { "0": "", "3": "", "4": "" } } ]
规则说明
- 第一步Shift操作:
- 遍历
objectname下的所有子对象,将Status、对象名称、values数组拆解到对应位置的数组中。 - 单独处理
Source字段,放到输出数组的最后两位。
- 遍历
- Modify操作:
- 当
objectname是单个对象时,第一步生成的结果会是单个元素而非数组,通过ifElse和IsArray判断,将其包装为数组,保证格式统一。
- 当
- 第三步Shift操作:
- 把处理后的数组展开,合并成最终的输出结构。
内容的提问来源于stack exchange,提问作者self lab
相关产品推荐
相关产品推荐

