通过公共键值对组合JSON

时间:2018-05-11 16:12:19

标签: json join jq

我目前正在处理一个问题,似乎无法解决这个问题。这是一些数据,所以你知道我在下面谈论的内容:

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 :(得分:1)

使用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

产生如下所示的输出。

请注意,字典中的指示对象包含完整对象(包括#34; 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
}