我有一个问题,我正在接收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下,因此上述操作将两个块的情况正常化到同一个流中)