求助:基于属性值关联的JOLT JSON格式转换实现
使用JOLT实现JSON关联转换解决方案
需求:将输入JSON按照「第一个数组元素的deps.name与第二个数组元素的spec.name匹配」的规则转换为指定输出格式。
输入JSON
[ { "key": "Primary", "metadata": { "name": "35f8d9fac891" }, "deps": [ { "name": "e6ae6d29edf8" } ], "spec": { "vattr1": "vval1", "vattr2": "vval2" } }, { "key": "Secondary", "metadata": { "name": "hp74z" }, "spec": { "name": "e6ae6d29edf8", "nattr1": "nval1", "nattr2": "nval2", "deps": { "Name": "5505da219463" } } } ]
期望输出JSON
{ "key": "Primary", "metadata": { "name": "35f8d9fac891" }, "deps": [ { "name": { "key": "Secondary", "metadata": { "name": "hp74z" }, "spec": { "name": "e6ae6d29edf8", "nattr1": "nval1", "nattr2": "nval2", "deps": { "Name": "5505da219463" } } } } ], "spec": { "vattr1": "vval1", "vattr2": "vval2" } }
JOLT转换规范
[ { "operation": "shift", "spec": { "1": { "@": "lookup.@spec.name" }, "0": { "*": "&", "deps": { "*": { "name": "deps[&1].nameKey" } } } } }, { "operation": "modify-overwrite-beta", "spec": { "deps": { "*": { "name": "@(2,lookup.@(1,nameKey))" } } } }, { "operation": "remove", "spec": [ "lookup", "deps[*].nameKey" ] } ]
逻辑说明
- 第一步shift:构建临时
lookup映射表,将Secondary对象以其spec.name为索引存储;同时保留Primary的基础字段,把原deps.name的值暂存为nameKey。 - 第二步modify-overwrite-beta:通过
nameKey到lookup中匹配对应的Secondary对象,替换Primary里deps数组中的name字段值。 - 第三步remove:清理临时生成的
lookup和nameKey字段,得到最终输出结构。
内容的提问来源于stack exchange,提问作者guru
相关产品推荐
相关产品推荐

