使用JOLT转换列表为对象数组并填充attr关联codes数据
JSON转换需求:用codes字段丰富items中的attr数组为对象映射
输入JSON
{"items": {"a1b2xxxx": {"name": "item 1","attr": ["A","B","C"]},"c2b2cxxxx": {"name": "item 2","attr": ["D","E","F"]}},"codes": {"A": {"color": "green"},"B": {"size": "M"},"C": {"sku": "NS"},"D": {"stock": 2},"E": {"some_key": "some_value"},"F": {"foo": "bar"}}}
期望输出JSON
{"items": {"a1b2xxxx": {"name": "item 1","attr": {"A": {"color": "green"},"B": {"size": "M"},"C": {"sku": "NS"}}},"c2b2xxxx": {"name": "item 2","attr": {"D": {"stock": 2},"E": {"some_key": "some_value"},"F": {"foo": "bar"}}}},"codes": {"A": {"color": "green"},"B": {"size": "M"},"C": {"sku": "NS"},"D": {"stock": 2},"E": {"some_key": "some_value"},"F": {"foo": "bar"}}}
当前尝试的转换器
[{"operation": "cardinality","spec": {"items": {"*": {"attr": "ONE"}}}}]
解决方案
你之前用cardinality操作的思路有误,cardinality: "ONE"是将数组转为单个元素(仅保留第一个),无法实现把数组所有元素映射为对象键值对的需求。正确做法是使用shift操作重组结构,同时引用codes中的对应值:
[ { "operation": "shift", "spec": { "codes": "&", "items": { "*": { "name": "&1.name", "attr": { "*": { "@(3,codes,&)": "&2.attr.&" } } } } } } ]
转换逻辑说明
- 保留
codes字段不变("codes": "&"); - 遍历
items下的所有子项("*"),保留原name字段; - 遍历每个子项的
attr数组元素("*"),通过@(3,codes,&)向上3层获取codes中与当前数组元素同名的对象,再将其映射到当前子项的attr对象下,以数组元素为键("&2.attr.&")。
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

