Как не пропустить массив, содержащий ноль, используя JQ? - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу обработать эти данные

{
  "results": [
    {
      "headword": "binding",
      "senses": [
        {
          "definition": [
            "a promise, agreement etc that must be obeyed"
          ]
        }
      ]
    },
    {
      "headword": "non-binding",
      "senses": [
        {
          "definition": [
            "a non-binding agreement or decision does not have to be obeyed"
          ],
          "examples": [
            {
              "text": "The industry has signed a non-binding agreement to reduce pollution."
            }
          ]
        }
      ]
    }
  ]
}

в эту

{
  "headword": "binding",
  "definition": "a promise, agreement etc that must be obeyed",
  "examples": null
}
{
  "headword": "non-binding",
  "definition": "a non-binding agreement or decision does not have to be obeyed",
  "examples": "The industry has signed a non-binding agreement to reduce pollution."
}

эту команду

cat data.json | jq '.results[] | {headword: .headword, definition: .senses[].definition[], examples: .senses[].examples[].text}'

с ошибками 'Can't iterate over null'

чтобы преодолеть это, эта команда использует '. []?'фильтр

cat data.json | jq '.results[] | {headword: .headword, definition: .senses[].definition[], examples: .senses[].examples[]?.text}'

но выводит только

{
  "headword": "non-binding",
  "definition": "a non-binding agreement or decision does not have to be obeyed",
  "examples": "The industry has signed a non-binding agreement to reduce pollution."
}

так, как вы перебираете нуль, а не пропускаете массив?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Как неявно указывал @oguzismail, предполагать, что массив чувств имеет только один элемент, рискованно, тем более, что выбор имени предполагает, что каждый заголовок может иметь более одного смысла.Аналогичное наблюдение может быть сделано в отношении .examples, но Q не проясняет, что должно быть сделано, если .examples имеет более одного элемента.

В дальнейшем я поэтому выберу безопасный подход, так какего можно легко отрегулировать в соответствии с более конкретными требованиями.

.results[]
| { headword }
  + (.senses[]
     | { definition: .definition[0],
         examples: (if has("examples")
                    then [.examples[].text]
                    else null end) } )
0 голосов
/ 30 ноября 2018

Использование оператора if / else может помочь.

jq '.results[] | {
    headword,
    definition: .senses[0].definition[0],
    examples: (if .senses[0].examples then .senses[0].examples[0].text else null end)
}' data.json
...