Linux命令打印相同密钥的所有json

时间:2019-05-05 07:56:32

标签: json jq

我将json作为字符串“ Str”

"{
  "A": {
    "id": 4
  },
  "B": {//Something},
  "C": {
    "A": {
      "id": 2
    }
  },
  "E": {
    "A": null
  },
  "F": {//Something}
}"

我想要“ A”的所有非空值,这些值可以在json中的任何位置重复。我想要像“ A”的所有内容一样输出

{"id": 4}
{"id": 2}

您能用Linux命令帮助我获得此信息吗?

2 个答案:

答案 0 :(得分:4)

使用一种能够明智地解析JSON值的工具,而不是面向行的工具。使用的示例:

$ 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工具的创建者