jq Разбор и замена строковых JSON свойств и игнорирование пропущенных свойств - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь преобразовать набор дочерних свойств из строкового JSON в JSON. Когда свойство "c" всегда существует, оно работает хорошо:

FileZ:

{
  "a": [
    {
      "b": "x",
      "c": "{\"foo\": 1}"
    },
    {
      "b": "y",
      "c": "{\"foo\": 2}"
    }
  ]
}

$ jq '.a[].c |= fromjson' FileZ

Выход

{
  "a": [
    {
      "b": "x",
      "c": {
        "foo": 1
      }
    },
    {
      "b": "y",
      "c": {
        "foo": 2
      }
    }
  ]
}

Однако, когда один из " c "свойства выше отсутствуют, это не удается.

jq: error (at FileZ:11): null (null) only strings can be parsed

Как я могу игнорировать эту ошибку и вместо этого привести:

{
  "a": [
    {
      "b": "x",
      "c": {
        "foo": 1
      }
    },
    {
      "b": "y"
    }
  ]
}

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Существует ли более обобщенный подход ... Например, если "c" вложено дальше в массив, а один из родителей не существует?

Вы можете sh рассмотреть вопрос об использовании walk:

walk(if type == "object" and has("c") then .c |= fromjson else . end)
1 голос
/ 16 апреля 2020

Есть ли более обобщенный подход, который не требует проверки?

Ниже приведено обобщенное решение без какого-либо явного использования if, но для него требуется версия 1.5 или более поздняя:

(.. | .c? // empty) |= fromjson
1 голос
/ 16 апреля 2020

Проверьте, существует ли .c, прежде чем подавать его на fromjson.

.a[] |= if has("c") then .c |= fromjson else . end
...