Добавить или обновить поле в одном файле JSON из другого файла JSON на основе соответствующего поля - PullRequest
0 голосов
/ 02 июля 2019

У меня есть два файла JSON a.json и b.json. Содержимое файла .json представляет собой объект JSON, а внутри b.json - массив. Я хочу добавить / обновить поле status в каждом mappings в файле a.json путем извлечения значения из файла b.json.
a.json:

{
  "title": 25886,
  "data": {
    "request": {
      "c": 46369,
      "t1": 1562050127.376641
    },
  },
  "rs": {
    "mappings": {
      "12345": {
        "id": "12345",
        "name": "test",
        "customer_id": "11228",
      },
      "45678": {
        "id": "45678",
        "name": "abc",
        "customer_id": "11206",
      }
    }
}}

b.json:

[
  {
    "status": "pending",
    "extra": {
      "name": "test"
    },
    "enabled": true,
    "id": "12345"
  },
  {
    "status": "not_started",
    "extra": {
      "name": "abc"
    },
    "enabled": true,
    "id": "45678"
  }
]

Ниже мой ожидаемый результат:

{
  "title": 25886,
  "data": {
    "request": {
      "c": 46369,
      "t1": 1562050127.376641
    },
  },
  "rs": {
    "mappings": {
      "12345": {
        "id": "12345",
        "name": "test",
        "customer_id": "11228",
        "status":"pending"
      },
      "45678": {
        "id": "45678",
        "name": "abc",
        "customer_id": "11206",
        "status":"not_started"
      }
    }
}}

В этом ожидаемом файле JSON у нас есть поле status, значение которого извлекается из файла b.json на основе соответствующего значения id. Как это сделать, используя jq?

1 Ответ

0 голосов
/ 02 июля 2019

Для целей этой проблемы b.json по существу определяет словарь, поэтому для простоты, эффективности и, возможно, элегантности, имеет смысл начать с использования встроенной функции INDEX для создания соответствующего словаря:

INDEX( $b[] | {id, status}; .id )

Это предполагает вызов jq в соответствии с:

jq --argfile b b.json -f update.jq a.json

(Да, я знаю, --argfile устарел. Не стесняйтесь выбирать другой способ установить $ b для содержимого b.json.)

Теперь, чтобы выполнить обновление, проще всего будет использовать оператор "update" |= в сочетании с map_values. (Не стесняйтесь проверить руководство JQ: -)

Собираем все вместе:

INDEX( $b[] | {id, status}; .id ) as $dict
| .rs.mappings |= map_values( .status = $dict[.id].status )
...