我将json作为字符串“ Str”
"{
"A": {
"id": 4
},
"B": {//Something},
"C": {
"A": {
"id": 2
}
},
"E": {
"A": null
},
"F": {//Something}
}"
我想要“ A”的所有非空值,这些值可以在json中的任何位置重复。我想要像“ A”的所有内容一样输出
{"id": 4}
{"id": 2}
您能用Linux命令帮助我获得此信息吗?
答案 0 :(得分:4)
使用一种能够明智地解析JSON值的工具,而不是面向行的工具。使用jq的示例:
$ json_value='{"A":{"id":4},"B":{"foo":0},"C":{"A":{"id":2}},"E":{"A":null},"F":{"foo":0}}'
$
$ jq -c '..|objects|.A//empty' <<< "$json_value"
{"id":4}
{"id":2}
.. # list nodes recursively
| objects # select objects
| .A // empty # print A's value if present.
答案 1 :(得分:0)
,这是一个替代解决方案,基于用于JSON的步行路径Unix工具: jtc
-在这里,您可以将查询逻辑“编码”到路径中(将您的要求结合到仅打印最后一行):
bash $ jv='{"A":{"id":4},"B":{"foo":0},"C":{"A":{"id":2}},"E":{"A":null},"F":{"foo":0}}'
bash $ jtc -w'<A>l:[0][-1]' -r <<<$jv
{ "id": 4 }
{ "id": 2 }
bash $ jtc -w'<A>l:[0][-1]' -r <<<$jv | tail -1
{ "id": 2 }
bash $
bash $ # or alternatively:
bash $
bash $ jtc -w'<A>l:[0][-1]' -j <<<$jv | jtc -w[-1:] -r
{ "id": 2 }
bash $
说明:
<A>l:
将找到所有带有标签"A"
的JSON元素,[0]
将尝试寻址找到的JSON中的第一个元素(显然null
会在此处失败)[-1]
将为在上一步中幸存的那些活动提高1 JSON级别(即,这是一种解决父母的方法)
PS>披露:我是jtc
工具的创建者