You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.&"
          }
        }
      }
    }
  }
]

错误原因分析

  1. 层级引用错误:原Spec中@(2,product_subclass)的层级计算错误,在rules.{product_class}节点下,需要向上3层才能访问到根节点的product_subclass字段,原写法无法匹配到目标节点,导致attributes为null。
  2. 字段映射错误:原Spec中"*": "attributes"会将所有字段的值直接赋值给attributes,而非构建对象,正确写法应为"*": "attributes.&",保留原字段名并构建嵌套对象。

内容的提问来源于stack exchange,提问作者Atihska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:17:22