如何将嵌套数组外部的已知键合并为该数组的对象元素?
问题描述
现有输入JSON:
[ { "some_key": "x", "foo_id": 123, "foo_name": "bar_1", "all_foo": [ { "foo_id": 456, "foo_name": "bar_2" } ] } ]
需求:将外层的foo_id和foo_name封装为对象,合并到all_foo数组中,同时移除原外层的这两个键,最终输出结构如下(all_foo数组元素顺序无要求):
[ { "some_key": "x", "all_foo": [ { "foo_id": 123, "foo_name": "bar_1" }, { "foo_id": 456, "foo_name": "bar_2" } ] } ]
已尝试的Jolt转换规则:
[ { "operation": "shift", "spec": { "*": "&", "all_foo": { "*": "&", "&1": "[&1].&" } } } ]
正确Jolt转换方案
可以通过shift操作完成需求,这里提供两种实现方式:
方式一:指定数组位置(可控顺序)
[ { "operation": "shift", "spec": { "*": { // 保留原对象中除foo相关键外的其他字段 "some_key": "[&1].&", // 将外层foo_id、foo_name封装为对象,放到all_foo数组的第一个位置 "foo_id": "[&1].all_foo[0].&", "foo_name": "[&1].all_foo[0].&", // 将原all_foo数组的元素追加到后续位置 "all_foo": { "*": "[&2].all_foo[#2].&" } } } } ]
规则说明
- 外层
"*"遍历输入数组的每个对象; "[&1].&"中&1指代外层数组的索引,&保留原键名,实现some_key的原样保留;all_foo[0]固定将外层的foo键值对放到数组首位;[&2].all_foo[#2].&中&2回溯到外层数组索引,#2表示原all_foo数组的元素索引+1,确保原数组元素接在新对象之后。
方式二:自动追加数组(无顺序要求)
如果不关心all_foo的元素顺序,可使用更简洁的规则:
[ { "operation": "shift", "spec": { "*": { "some_key": "[&1].&", // 匹配所有foo_开头的键,封装为对象后追加到all_foo数组 "foo_*": "[&1].all_foo[].&", // 将原all_foo数组的所有元素追加到目标数组 "all_foo": { "*": "[&2].all_foo[]" } } } } ]
规则说明
"foo_*"匹配所有以foo_开头的字段,all_foo[]会自动将这些键值对封装为单个对象并追加到数组;- 原
all_foo数组的元素通过[&2].all_foo[]也追加到目标数组,最终两个对象会合并到同一个数组中,满足需求中“顺序无要求”的条件。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

