JOLT双层嵌套转换问题:无法获取内部嵌套属性
JOLT转换无法提取嵌套属性解决方案
需求
根据输入JSON中的product_class和product_subclass字段,从rules节点中匹配对应层级的属性,转换为包含attributes、product_class、product_subclass的指定格式。
输入JSON
{ "product_class": "Home", "product_subclass": "Cutlery", "rules": { "Home": { "Cutlery": { "is_sharp": true, "is_prohibited_ca": false, "requires_age_verification": false, "compliance_policy_id": "CP-1" }, "Rug": { "is_sharp": false, "is_prohibited_ca": true, "requires_age_verification": true, "compliance_policy_id": "CP-4" } }, "Lighter": { "Default": { "is_sharp": false, "is_hazmat_ground": true, "is_hazmat_air": true, "compliance_policy_id": "CP-210" } } } }
错误的JOLT Spec
[ { "operation": "default", "spec": { "rules": "=@(rules)" } }, { "operation": "shift", "spec": { "rules": { "@(1,product_class)": { "@(2,product_subclass)": { "*": "attributes" } } }, "product_class": "product_class", "product_subclass": "product_subclass" } } ]
输出对比
期望输出
{ "attributes" : { "is_sharp" : true, "is_prohibited_ca" : false, "requires_age_verification" : false, "compliance_policy_id" : "CP-1" }, "product_class" : "Home", "product_subclass" : "Cutlery" }
实际输出
{ "attributes" : null, "product_class" : "Home", "product_subclass" : "Cutlery" }
正确的JOLT转换方案
方案一:直接层级引用
[ { "operation": "shift", "spec": { "product_class": "product_class", "product_subclass": "product_subclass", "rules": { "@(1,product_class)": { // 匹配rules下与根节点product_class同名的节点 "@(3,product_subclass)": { // 向上3层到根节点,获取product_subclass的值作为匹配节点 "*": "attributes.&" // 将匹配节点下的所有字段映射到attributes的对应键 } } } } } ]
方案二:临时变量存储(更直观)
[ // 第一步:将product_class和product_subclass存入临时节点,方便后续引用 { "operation": "shift", "spec": { "product_class": ["product_class", "temp.class"], "product_subclass": ["product_subclass", "temp.subclass"], "rules": "rules" } }, // 第二步:通过临时变量匹配rules中的对应节点 { "operation": "shift", "spec": { "product_class": "product_class", "product_subclass": "product_subclass", "rules": { "@(1,temp.class)": { "@(1,temp.subclass)": { "*": "attributes.&" } } } } } ]
错误原因分析
- 层级引用错误:原Spec中
@(2,product_subclass)的层级计算错误,在rules.{product_class}节点下,需要向上3层才能访问到根节点的product_subclass字段,原写法无法匹配到目标节点,导致attributes为null。 - 字段映射错误:原Spec中
"*": "attributes"会将所有字段的值直接赋值给attributes,而非构建对象,正确写法应为"*": "attributes.&",保留原字段名并构建嵌套对象。
内容的提问来源于stack exchange,提问作者Atihska
相关产品推荐
相关产品推荐

