Json JQ中的可选键

Json JQ中的可选键,json,bash,jq,Json,Bash,Jq,输入内容(somejson.json)为 是否有提取选项,比如m1。是否也提取m2(如果存在) 例如。 对于m1,我使用下面的命令 cat somejson.json |jq '.m1' cat somejson.json |jq '.m2' 输出 "1 some m1" "2 some m1" "3 some m1" "4 some m1" null null "3 some m2" null 对于m2,我使用下面的命令 cat somejson.json |jq '.m1' cat

输入内容(somejson.json)为

是否有提取选项,比如m1。是否也提取m2(如果存在)

例如。 对于m1,我使用下面的命令

cat somejson.json |jq '.m1'
cat somejson.json |jq '.m2'
输出

"1 some m1"
"2 some m1"
"3 some m1"
"4 some m1"
null
null
"3 some m2"
null
对于m2,我使用下面的命令

cat somejson.json |jq '.m1'
cat somejson.json |jq '.m2'
输出

"1 some m1"
"2 some m1"
"3 some m1"
"4 some m1"
null
null
"3 some m2"
null
但是我想要一个合并的结果,包括m1和m2,如下所示

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

获得两个值;如果它们不存在,则它们将
null
。然后从结果中过滤空值

<somejson.json jq '.m1, .m2 | select(. != null)'

要始终提取
m1

jq '.m1, if (.m2 != null) then .m2 else empty end' somejson.json

如果m2存在并且等于null,这在技术上不符合规定的要求。@peak:实际上,你错了
jq
不是JavaScript,因此
false!=空
;因此,正确地检测到
false
null
被删除,但这实际上是OP的要求(根据
“m2”:第一个对象中的null
情况未反映在输出中)。除非您认为要求总是提取
m1
?是的,如果逐字读取,要求是基于密钥的存在,而不是基于它是否为非空。@peak,再次,否。查看示例数据和所需结果。语言可能会误导人;代码和数据是明确的。是的,但要求是:
如果存在,也提取m2
。也许最好让OP解决不一致的问题。@peak你能停下来吗?该文本与示例数据不一致,我选择信任该数据。这是我第三次重复同样的事情。阿迪塞山-请解决与所述要求和示例不一致的问题。@peak对不起,我无法理解不一致是什么。阅读以更新问题。请纠正我。@ AddiSeHANK——考虑{}和{“KEY”:NULL}之间的差异。第一个对象没有名为“key”的键,但是
{}|。key
{key:null}
都产生
null
。另请参见Amaden的评论:“该文本与样本数据不一致。”@peek I删除了误导性词语“key”。