使用Jolt Transformation扁平化嵌套数组JSON的配置问题
Jolt实现嵌套数组字段扁平化方案
需求说明
输入是对象数组结构,每个对象包含固定长度为1的lang数组,数组内存放编程语言能力对象,需要将数组内的primary、secondary字段提取到外层对象同级,完成结构扁平化。
输入示例
[ { "name": "James", "id": 1, "lang": [ { "primary": "python", "secondary": "c++" } ] }, { "name": "Kevin", "id": 2, "lang": [ { "primary": "scala", "secondary": "java" } ] } ]
期望输出
[ { "name": "James", "id": 1, "primary": "python", "secondary": "c++" }, { "name": "Kevin", "id": 2, "primary": "scala", "secondary": "java" } ]
错误原因
之前编写的转换规范存在两个问题:
- 输出路径里加了多余的转义符
\,Jolt会把转义后的[、.、]当成字段名的普通字符,最终生成的key会是lang[0].primary这种错误格式,无法和外层的name、id字段合并到同一个对象 - 路径层级匹配错误,没有正确对齐外层数组的索引位置
正确转换规范
[ { "operation": "shift", "spec": { "*": { "name": "[&1].name", "id": "[&1].id", "lang": { "*": { "primary": "[&3].primary", "secondary": "[&3].secondary" } } } } } ]
通配符层级说明
处理lang数组内字段时,&3代表向上回溯3层的索引值:
- 第0层(当前层):
primary/secondary字段 - 向上1层:
lang数组内的元素索引(固定为0,因为数组长度恒为1) - 向上2层:
lang字段本身 - 向上3层:最外层数组的对象索引,和
name、id映射的[&1]指向同一个目标对象,直接把字段写入该对象根节点即可完成扁平化
运行效果参考:
内容的提问来源于stack exchange,提问作者sho
相关产品推荐
相关产品推荐

