JOLT条件取值优化问询:存在B取B数据,无B则取A数据
JOLT JSON转换优化方案
需求说明
当输入存在P.B节点时,提取其One.Two.Three下的数据;若P.B不存在,则提取P.A.One.Two.Three下的数据。
优化后的JOLT Spec
[ { "operation": "modify-default-beta", "spec": { "P": { "B": "@(1,A)" // 当P.B不存在时,将P.A的内容赋值给P.B } } }, { "operation": "shift", "spec": { "P": { "B": { "One": { "Two": { "Three": { "*": { "ID": "Data.ID", "Some": { "ID_1": "Data.ID_1", "*": "Data.&" // 动态匹配Some下的其他字段(如AAA/BBB) } } } } } } } } } ]
方案解析
- modify-default-beta操作:确保
P.B节点始终存在。若原始输入无P.B,自动将P.A的内容复制到P.B;若已有P.B,则保留原内容,无需额外分支判断。 - shift操作:统一从
P.B.One.Two.Three路径提取数据:- 直接映射
ID到Data.ID - 映射
Some.ID_1到Data.ID_1 - 用
*动态匹配Some下的自定义字段(如示例中的AAA或BBB),自动同步到Data节点下
- 直接映射
验证结果
- 带B的输入输出:
{ "Data": { "ID": "654321", "ID_1": "987654321", "BBB": "bbb" } }
- 不带B的输入输出:
{ "Data": { "ID": "123456", "ID_1": "123456789", "AAA": "aaa" } }
原Spec问题分析
原Spec仅在P.B存在时生效,因为modify-default-beta仅修改P.B.One.Two.Three.*.ID,但如果P.B本身不存在,该操作不会生成P.B节点,导致后续shift操作找不到对应路径,无法输出结果。
内容的提问来源于stack exchange,提问作者Danon
相关产品推荐
相关产品推荐

