我有一个问题,我正在接收JSON,根据来源,可能在根级别或在另一个元素下有一些数据.

从这个JSON中,我需要将多个元素提取到另一个标准化的JSON中,并为这些值提供定制键.

样例JSON 1:

{"name":"John","last":"Smith","position": "clerk"}

样例JSON 2:

{"personData": {"name":"John","last":"Smith"}}

我一开始使用的是这个,因为我所有的测试json都有第一种形式:

jq '{nombre: .name, apellido: .last, puesto: .position}'

当它们开始空闲时,我try 使用//操作符,但如果我提供密钥,它似乎不起作用:

不起作用:

jq '{nombre: .name//.personData.name, apellido: .last, puesto: .position}'

有效(但我没有任何 keys ):

jq '{nombre: .name//.personData.name, apellido: .last, puesto: .position//null}'

我从来没有将JQ与这样的条件或逻辑一起使用过,所以我可能遗漏了一些明显的东西. (实际的json文件相当广泛,我需要使用的逻辑最终将应用于十几个左右的字段,所以我正在寻找一个可持续的解决方案.

第一个样本的预期输出为:

{"nombre" : "John", "apellido": "Smith", "puesto": "clerk" }

对于第二个样本:

{"nombre" : "John", "apellido": "Smith", "puesto": null}

回答: 最终使用此样式,该样式允许在多个块中搜索以提取多个数据:

(.personData // .) + (.addressData // .) | {nameValue: .name, streetValue: .streetName }

(简化:.name值可以在根目录下,也可以在.PersData.name下,.streetName值可以在根目录下,也可以在.AddressData.streetValue下,因此上述操作将两个块的情况正常化到同一个流中)

推荐答案

这是众多可能性之一:

(.personData // .) |  {nombre: .name, apellido: .last, puesto: .position}

如果您想要对带有.name的所有JSON对象进行完全搜索,那么可以使用..walk/1.如果您最多想要一个这样的对象,您可以使用first/1,这可能是一个好主意,因为它可能会加快速度.

Json相关问答推荐

从先前的REST调用创建动态JSON主体

如何在VegaLite中应用Times New Roman,CaliBiri字体

过go 24小时内判断员事件的EventBridge事件模式

盒子图显示不正确

PowerShell女士:如何处理json对象?

来自json的可分析的构建报告

Azure数据工厂-WEB活动输出赢得';t返回JSON

将 std::可选值存储到 json 文件 C++

Spark-SQL中的from_unixtime函数未能给出正确的输出

JOLT转换并向输出添加新数组

我无法将来自 API 的数据显示到 FlatList 中,但我在 console.log 中看到了它.问题是什么?

如何为所有 API 端点全局设置 http.ResponseWriter Content-Type 标头?

如何比较 JSON 文档并返回与 Jackson 或 Gson 的差异?

如何使用 Jackson 重命名 JSON 序列化中的根键

通过 RestAssured 中的 JsonPath 访问匿名数组的元素

如何使用 LWP 发出 JSON POST 请求?

有没有办法使用 Jackson 将 Map 转换为 JSON 表示而不写入文件?

JSON 使用 simplejson 序列化 Django 模型

如何在 Django JSONField 数据上聚合(最小/最大等)?

来自 Gson 的 JSON 字符串:删除双引号