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
相关产品推荐
相关产品推荐

