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

如何修复Jolt移除JSON空值时出现的重复数组问题

解决Jolt转换中Adjustment字段重复的问题

需求与输入

输入JSON数据:

[
  {
    "Type": "MOBILE_ADJUSTMENT",
    "MobileAdjustment": {
      "BidModifier": 110,
      "OperatingSystemType": "IOS"
    },
    "DesktopAdjustment": null,
    "SmartTvAdjustment": null
  }
]

需求:移除所有null值的字段,仅保留Adjustment相关字段,并添加默认值AdGroupId: 1。

原尝试的Jolt规范及问题

使用以下Jolt规范后,转换结果出现MobileAdjustment数组重复的问题:

[
  {
    "operation": "default",
    "spec": {
      "*": {
        "*": "NULLS"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "NULLS": null,
          "*": {
            "@1": "&2"
          }
        }
      }
    }
  },
  {
    "operation": "default",
    "spec": {
      "AdGroupId": 1
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*Adjustment": "&",
      "AdGroupId": "AdGroupId"
    }
  }
]

错误转换结果:

{
  "AdGroupId": 1,
  "MobileAdjustment": [
    {
      "BidModifier": 110,
      "OperatingSystemType": "IOS"
    },
    {
      "BidModifier": 110,
      "OperatingSystemType": "IOS"
    }
  ]
}

预期结果:

{
  "AdGroupId": 1,
  "MobileAdjustment": [
    {
      "BidModifier": 110,
      "OperatingSystemType": "IOS"
    }
  ]
}

问题原因

原规范中第一个shift操作逻辑冗余且错误:遍历数组元素下的所有字段时,处理MobileAdjustment的子字段时,@1会将整个MobileAdjustment对象再次映射到外层的&2(即MobileAdjustment字段),加上原本的对象,导致数组元素重复。此外,前置的default操作给所有字段设置NULLS默认值完全多余,反而增加了处理复杂度。

修改后的Jolt规范

直接简化逻辑,用shift过滤null字段,再添加默认值:

[
  // 过滤保留非空的Adjustment字段
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*Adjustment": "&2"
      }
    }
  },
  // 添加默认AdGroupId
  {
    "operation": "default",
    "spec": {
      "AdGroupId": 1
    }
  }
]

解释

  1. shift操作:仅匹配并保留所有以Adjustment结尾的非空字段,null值会被自动忽略,无需额外处理。
  2. default操作:为结果添加默认的AdGroupId字段,值为1。

使用该规范转换后,即可得到预期的无重复字段的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:13:16