Переименование ключа JSON по определенному шаблону

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

ZFS очень, очень, действительно не нравится, когда один и тот же пул используется несколькими системами одновременно, даже в режиме чтения -только (-o readonly=on, заданном для zpool import), но это не кажется, не применимо к вашей ситуации.

Чтобы поддерживать совместимость между двумя версиями, вы должны убедиться, что не для запуска zpool upgradeили zfs upgrade, особенно из более новой установки. Любой из них может привести к потере доступа к пулу или файловой системе при запуске старой установки, но ни один из них не должен привести к потере пула или файловой системы при запуске системы, поддерживающей ZFS на -версии диска, обновленной до.

Когда вы закончите обновление, если хотите, вы можете обновить пул до последней версии формата диска -и функций, используя zpool upgradeи/или zfs upgradeпо мере необходимости.

2
29.04.2021, 00:12
1 ответ
$ jq '(.quiz[] | select(has("id"))).q1 |= with_entries(select(.key == "answer").key |= "answer_id")' file.json
{
  "quiz": {
    "sport": {
      "id": "77",
      "q1": {
        "question": "Which one is correct team name in NBA?",
        "options": [
          "New York Bulls",
          "Huston Rocket"
        ],
        "answer_id": "Huston Rocket"
      }
    },
    "maths": {
      "q1": {
        "question": "5 + 7 = ?",
        "options": [
          "10",
          "13"
        ],
        "answer": "13"
      }
    }
  }
}

Выражение jqсамо по себе:

(.quiz[] | select(has("id"))).q1 |=
    with_entries(select(.key == "answer").key |= "answer_id")

При этом используетсяjqдля поиска правильной записи .quiz, которая имеет ключ id.

Для этой записи он выбирает q1значение ключа (объекта JSON ),и переименовывает ключ answerэтого объекта в answer_id. Переименование ключа выполняется с помощью with_entries(), который преобразует как ключи, так и значения объекта в изменяемые значения, а затем обратно. Внутри with_entries()мы выбираем ключ, который хотим переименовать, и просто переименовываем его.

Я предпочел использовать правильный синтаксический анализатор JSON, а не пытаться использовать awkили какой-либо другой инструмент, который не очень полезен для анализа форматов структурированных документов. Обратите внимание, что ваш пример документа мог выглядеть как

{"quiz":{"sport":{"id":"77","q1":{"question":"Which one is correct team name in NBA?","options":["New York Bulls","Huston Rocket"],"answer":"Huston Rocket"}},"maths":{"q1":{"question":"5 + 7 = ?","options":["10","13"],"answer":"13"}}}}

, который является действительным документом JSON, эквивалентным документу в вопросе. Инструмент jqпроанализировал бы их оба одинаково и дал бы одинаковый результат.

3
28.07.2021, 11:36

Теги

Похожие вопросы