Команда Linux для печати всех jsons одного и того же ключа - PullRequest
0 голосов
/ 05 мая 2019

У меня есть 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 ]

4 голосов
/ 05 мая 2019

Вместо линейно ориентированных используйте инструмент, способный синтаксически анализировать значения 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.
0 голосов
/ 06 мая 2019

и вот альтернативное решение, основанное на Unix-инструменте Walk-Path для JSON: 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: найдет все элементы JSON с меткой "A",
  • [0] попытается обратиться к первому элементу в найденном JSON (очевидно, null потерпит неудачу)
  • [-1] повысит уровень 1 JSON (т. Е. Это способ обратиться к родителям) для тех прогулок, которые пережили предыдущий шаг

PS> Раскрытие информации: я создатель jtc инструмента

...