Объединение JSON общими парами ключ-значение - PullRequest
0 голосов
/ 11 мая 2018

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

foo.json

{
    "Schedule": [
        {
            "deviceId": 123,
            "reservationId": 123456,
            "username": "jdoe"
        },
        {
            "deviceId": 456,
            "reservationId": 589114,
            "username": "jsmith"
        }
    ],
    "serverTime": 1522863125.019958
}

bar.json

[
    {
        "a": {
            "b": "10.0.0.1",
            "c": "hostname1"
        },
        "deviceId": 123
    },
    {
        "a": {
            "b": "10.0.0.2",
            "c": "hostname2"
        },
        "deviceId": 456
    }
]

foobar.json

{
    "Schedule": [
        {
            "deviceId": 123,
            "reservationId": 123456,
            "username": "jdoe",
            "a": {
                "b": "10.0.0.1",
                "c": "hostname1"
            }
        }
        },
        {
            "deviceId": 456,
            "reservationId": 789101,
            "username": "jsmith",
            "a": {
                "b": "10.0.0.2",
                "c": "hostname2"
            }
        }
    ],
    "serverTime": 1522863125.019958
}

Я пытаюсь использовать jq для этого, и мне помогла некоторая помощь из этого поста: https://github.com/stedolan/jq/issues/1090 Цель состоит в том, чтобы иметь возможность комбинировать JSON, используя некоторый ключ в качестве общей точки междудокументы.Данные могут быть вложены в любое количество уровней. В этом случае foo.json имеет вложенные данные только на двух уровнях, но его необходимо объединить с данными, вложенными на 1 уровень.

Любые и все предложения будут суперполезно.Я также рад уточнить и ответить на вопросы, если это необходимо.Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

С foobar.jq следующим образом:

def dict(f):
  reduce .[] as $o ({}; .[$o | f | tostring] = $o ) ;

($bar | dict(.deviceId)) as $dict
| .Schedule |= map(. + ($dict[.deviceId|tostring] ))

вызов:

jq -f foobar.jq --argfile bar bar.json foo.json

дает вывод, показанный ниже.

Обратите внимание, что ссылки в словаре содержат полный объект (включая пару ключ / значение для "deviceId"), но нет необходимости в del(.deviceId) из-за способа, которым + определен в jq.

выход

{
  "Schedule": [
    {
      "deviceId": 123,
      "reservationId": 123456,
      "username": "jdoe",
      "a": {
        "b": "10.0.0.1",
        "c": "hostname1"
      }
    },
    {
      "deviceId": 456,
      "reservationId": 589114,
      "username": "jsmith",
      "a": {
        "b": "10.0.0.2",
        "c": "hostname2"
      }
    }
  ],
  "serverTime": 1522863125.019958
}
...