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

Jolt转换返回null:如何通过索引提取数组单个元素?

问题描述

输入JSON:

{
  "id": "eea1c86e-e4e2-36df-a775-ad44a6d2d94e",
  "d": {
    "flag": 0,
    "a0": [
      {
        "a1": 0,
        "a2": -1,
        "a3": 7
      },
      {
        "a1": 2,
        "a2": -3,
        "a3": 4
      }
    ]
  }
}

期望输出:

{
  "dg" : {
    "gi" : 7          //7来自d.a0数组第一个元素的a3字段
  }
}

当前使用的Jolt规则:

[
  {
    "operation": "shift",
    "spec": {
      "d": {
        "a0": {
          "[0]": {
            "a3": "dg.gi"
          }
        }
      }
    }
  }
]

对应的Java代码:

List<Object> specs = JsonUtils.classpathToList(spec);
Chainr chainr = Chainr.fromSpec(specs);
// 转换消息
return (Map<String, Object>) chainr.transform(inputJSON);

转换结果返回null,需排查原因并修正。


问题原因与修正

核心错误:Jolt数组索引写法错误

Jolt的Shift操作中,访问数组元素的索引需直接使用数字作为键,而非带方括号的字符串"[0]"。原规则里的"[0]"会被当作普通键名,去匹配输入中a0下的"[0]"字段,但输入里不存在这个字段,导致匹配失败最终返回null。

修正后的Jolt规则

[
  {
    "operation": "shift",
    "spec": {
      "d": {
        "a0": {
          0: {  // 直接用数字0访问数组第一个元素
            "a3": "dg.gi"
          }
        }
      }
    }
  }
]

Java代码额外检查点

  • 确保JsonUtils.classpathToList(spec)正确加载Jolt规则文件,路径无错误
  • 确认inputJSON是合法的JSON对象(若为字符串需先解析为Map<String, Object>类型)

验证结果

使用修正后的规则,转换后会得到期望输出:

{
  "dg" : {
    "gi" : 7
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:26:02