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

Jolt转换:为contacts数组元素分配索引作为id字段值的问题求助

Jolt转换:为contacts数组元素分配索引作为id字段值的问题求助

大家好,我最近在做Jolt转换的时候遇到了一个问题,想请教下各位怎么解决:

我有这样一份输入JSON:

{
  "a": "foo",
  "bunch": 123,
  "of": "foo",
  "other": "foo",
  "keys": 123,
  "contacts": [
    {
      "id": null,
      "a": "foo",
      "bunch": 123,
      "of": "foo",
      "other": "foo",
      "keys": 123
    },
    {
      "id": null,
      "a": "foo",
      "bunch": 123,
      "of": "foo",
      "other": "foo",
      "keys": 123
    }
  ]
}

我的需求是:把contacts数组里每个元素的id字段替换成它在数组中的索引值(也就是第一个元素id为0,第二个为1),期望得到的输出是:

{
  "a": "foo",
  "bunch": 123,
  "of": "foo",
  "other": "foo",
  "keys": 123,
  "contacts": [
    {
      "id": 0,
      "a": "foo",
      "bunch": 123,
      "of": "foo",
      "other": "foo",
      "keys": 123
    },
    {
      "id": 1,
      "a": "foo",
      "bunch": 123,
      "of": "foo",
      "other": "foo",
      "keys": 123
    }
  ]
}

我自己尝试了下面这个Jolt规范:

[
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "contacts": {
        "*": {
          "*": "contacts[&1].&0",
          "$": "contacts[&1].id"
        }
      }
    }
  }
]

但这个方案没有成功,得到的id字段是一个数组,比如"id": [0, null],不是我想要的单个索引值。有没有大佬能帮我看看问题出在哪,怎么调整才能得到正确的结果?


解决方案说明

你的问题根源在于:原contacts元素里已经存在id: null字段,而你写的shift规范中,"*": "contacts[&1].&0"会匹配到这个原id字段,同时又用"$": "contacts[&1].id"把数组索引赋值给同一个id字段。Jolt遇到同一目标路径被多次赋值时,会把值合并成数组,所以才出现了[索引值, null]的情况。

只需要在处理contacts元素时,忽略原有的id字段,再赋值新的索引id即可,调整后的Jolt规范如下:

[
  {
    "operation": "shift",
    "spec": {
      "*": "&", // 保留顶层所有非contacts的字段
      "contacts": {
        "*": {
          "id": null, // 跳过原有的id字段,不映射它
          "*": "contacts[&1].&", // 保留当前contact元素的其他所有字段
          "$": "contacts[&1].id" // 将当前元素的数组索引赋值给新的id字段
        }
      }
    }
  }
]

这个规范会先排除原有的id,再把索引值赋值给id,这样就不会出现数组形式的结果了,正好符合你的期望输出。

备注:内容来源于stack exchange,提问作者Kyle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:09:13