如何用JQ提取不同层级JSON数据生成规范化JSON对象?
解决JSON数据层级不一致的规范化提取问题
接收的JSON数据因来源不同,数据可能位于根层级或某个子元素下,需要从这些JSON中提取多个元素,生成带有自定义键的规范化JSON对象。
示例JSON
示例1
{"name":"John","last":"Smith","position": "clerk"}
示例2
{"personData": {"name":"John","last":"Smith"}}
初始尝试
最初测试用的都是第一种格式,使用如下命令:
{nombre: .name, apellido: .last, puesto: .position}
遇到第二种格式时结果为空,尝试用//运算符处理,但直接在键值里使用无效:
{nombre: .name//.personData.name, apellido: .last, puesto: .position}
改用以下命令后能运行,但无法正确获取部分键值:
{nombre: .name//.personData.name, apellido: .last, puesto: .position//null}
由于实际场景涉及十几个字段,需要一个可复用的解决方案。
预期输出
示例1的输出
{"nombre" : "John", "apellido": "Smith", "puesto": "clerk" }
示例2的输出
{"nombre" : "John", "apellido": "Smith", "puesto": null}
最终解决方案
采用先归一化数据层级,再统一提取字段的方式,可处理多组数据分布在不同层级的场景,基础写法如下:
(.personData // .) | {nombre: .name, apellido: .last, puesto: .position // null}
如果需要处理更多不同层级的数据集(比如地址类数据),可扩展为:
(.personData // .) + (.addressData // .) | {nombre: .name, apellido: .last, puesto: .position // null, calle: .streetName // null}
逻辑说明:
.personData // .:优先读取personData子元素下的内容,若该子元素不存在,则直接使用根层级内容,实现数据层级的归一化+ (.addressData // .):可追加其他可能的子元素(如addressData),同样遵循「子元素优先,根层级兜底」的规则,合并多来源数据- 归一化后直接从统一对象中提取字段,用
// null为可能缺失的字段指定默认值,保证输出的JSON结构始终一致
内容的提问来源于stack exchange,提问作者Eduo
相关产品推荐
相关产品推荐

