如何移除Jolt转换输出中的null条目
Jolt转换后数组出现null条目,修正方案
问题场景
输入JSON、原Jolt规则、原输出、期望输出如下:
输入JSON
{ "node": { "3": [ { "name": "name3" }, { "shutdown": false } ], "6": [ { "name": "name6" }, { "shutdown": false } ] } }
原Jolt规则
[ { "operation": "shift", "spec": { "node": { "*": { "$": "node.[&1].id", "*": { "name": "node.[&2].name", "shutdown": "node.[&2].shutdown" } } } } } ]
原输出(含null冗余)
{ "node" : [ null, null, null, { "id" : "3", "name" : "name3", "shutdown" : false }, null, null, { "id" : "6", "name" : "name6", "shutdown" : false } ] }
期望输出
{ "node" : [ { "id" : "3", "name" : "name3", "shutdown" : false }, { "id" : "6", "name" : "name6", "shutdown" : false } ] }
问题原因
原规则中"$": "node.[&1].id"的&1会把原node对象的键("3"、"6")当作数组索引使用,Jolt会自动填充索引0-2、4-5的位置为null,产生冗余空位。实际需求是按遍历顺序生成连续数组,而非按键值作为索引。
修正后的Jolt规则
推荐两种简洁的实现方式:
方式一:利用自动数组追加([])和最后元素引用(-1)
[ { "operation": "shift", "spec": { "node": { "*": { // 将当前键值作为id,追加到node数组的新元素中 "$": "node[].id", // 提取第一个子对象的name到刚创建的数组元素 "[0]": { "name": "node[-1].name" }, // 提取第二个子对象的shutdown到同一个数组元素 "[1]": { "shutdown": "node[-1].shutdown" } } } } } ]
方式二:利用计数索引(#)指定连续位置
[ { "operation": "shift", "spec": { "node": { "*": { // #2 表示当前*的遍历计数(从0开始),对应数组的连续索引 "$": "node[#2].id", "*": { // #3 对应外层*的计数,确保name/shutdown落到同一数组元素 "name": "node[#3].name", "shutdown": "node[#3].shutdown" } } } } } ]
效果验证
两种规则转换后均会输出期望的连续数组,无null冗余条目。
内容的提问来源于stack exchange,提问作者Shyampal
相关产品推荐
相关产品推荐

