jq ничего не возвращает, если вложенный массив пуст - PullRequest
0 голосов
/ 03 июля 2018

здесь массив SubThings заполняется

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[{"subThing-1" : "subMeta1","subThing-2" : "subMeta2","subThing-n" : "subMetan"}]}]' | jq '.'
[
  {
    "subThings": [
      {
        "subThing-n": "subMetan",
        "subThing-2": "subMeta2",
        "subThing-1": "subMeta1"
      }
    ],
    "thing-n": "metan",
    "thing-2": "meta2",
    "thing-1": "meta1"
  }
]

вы можете видеть здесь, что недостающие ключи просто установлены в нуль.

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[{"subThing-1" : "subMeta1","subThing-2" : "subMeta2","subThing-n" : "subMetan"}]}]' |
 jq '[.[] | {"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"],}]'
[
  {
    "subThing-2": "subMeta2",
    "thing-5": null,
    "thing-1": "meta1"
  }
]

здесь массив SubThings пуст

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[]}]' | jq '.'
[
  {
    "subThings": [],
    "thing-n": "metan",
    "thing-2": "meta2",
    "thing-1": "meta1"
  }
]

вместо нулей для subThing-2 стирает все данные.

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[]}]' |
  jq '[.[] | {"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"],}]'
[]
$ 

Почему?
Есть ли другой способ получить данные без очистки массива пустым массивом?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы пытаетесь генерировать объекты, основываясь на существовании subThings объектов. Это действительно то, что .subThings[] делает в контексте {"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"]}.

Вам нужно оценить subThings отдельно и заменить на null, если таковых нет, в противном случае это будет просто empty, который ничего не дает (что вы здесь видите).

map({ "thing-1", "thing-5", "subThing-2": (.subThings[]."subThing-2" // null) })
0 голосов
/ 03 июля 2018

Я до сих пор не знаю, является ли json, который я получаю, плохим или это ошибка в jq. Я нашел это решение, используя sed, чтобы сделать массив не пустым.

$ echo '[{"thing-1" : "meta1","thing-2" : "meta2","thing-n" : "metan","subThings":[]}]' | sed 's/\[ *\]/[null]/g' | jq '[.[] | {"thing-1","thing-5","subThing-2":.subThings[]["subThing-2"],}]'
[
  {
    "thing-1": "meta1",
    "thing-5": null,
    "subThing-2": null
  }
]
$
...