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

