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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:02:34