JQ中的可选键

4

输入内容(somejson.json)是:

{ "m1": "1 some m1", "m2": null , "m3" : "unwanted"}
{ "m1": "2 some m1", "m3" : "unwanted"}
{ "m1": "3 some m1", "m2": "3 some m2" , "m3" : "unwanted"}
{ "m1": "4 some m1", "m3" : "unwanted"}

有没有提取m1的选项?如果存在,也请提取m2。

例子。我使用以下命令来提取m1:

cat somejson.json |jq '.m1'

输出

"1 some m1"
"2 some m1"
"3 some m1"
"4 some m1"

我使用以下命令来执行m2:

cat somejson.json |jq '.m2'

输出

null
null
"3 some m2"
null

但是我希望得到合并的结果,包括m1和m2,如下所示:
"1 some m1"
"2 some m1"
"3 some m1"
"3 some m2"
"4 some m1"

1
Adiseshan - 请解决所述要求和示例之间的不一致性。 - peak
@peak 对不起,我无法理解不一致性在哪里。请阅读更新的问题并纠正我。 - Adi
@AdiseshanK - 请考虑{}和{"key": null}之间的区别。第一个对象没有名为"key"的键,但是{} | .key{"key": null}都产生了null。另请参见Amaden的评论:"该文本与示例数据不一致。" - peak
@peek 我删除了误导性的词语“key”。 - Adi
2个回答

5
获取两个值;如果它们不存在,则将是 null。然后只需从结果中过滤出 null 值即可。
<somejson.json jq '.m1, .m2 | select(. != null)'

1
@peak:实际上,你错了。jq不是JavaScript,所以false!= null;因此false被正确检测到。null被删除,但这实际上是OP的要求(第一个对象中的“m2:null”情况没有反映在输出中)。除非你认为要始终提取m1 - Amadan
1
是的,如果按照字面意思阅读,要求基于键的存在,而不是它是否为非空。 - peak
2
@peak 再说一遍,不行。看看示例数据和期望的结果。词语可能会误导人;代码和数据是明确无歧的。 - Amadan
是的,但要求说:“如果存在,还要提取m2”。也许最好询问OP解决不一致性。 - peak
3
@peak,你能停一下吗?那个文本与示例数据不一致,而我选择相信数据。这已经是我第三次重复同样的话了。 - Amadan

2
始终提取m1的方法是:
jq '.m1, if (.m2 != null) then .m2 else empty end' somejson.json

1
如果m2存在且等于null,则从技术上讲,这不符合所述要求。 - peak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接