首页 > 解决方案 > 通过通用键值对组合 JSON

问题描述

我目前正在解决一个问题,但似乎无法解决这个问题。这里有一些数据,所以你知道我在下面说什么:

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
    }
]

foob​​ar.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 级深的数据相结合。

任何和所有建议都会非常有帮助。如果需要,我也很乐意澄清和回答问题。谢谢!

标签: jsonjoinjq

解决方案


使用 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”的键/值对),但由于jq 中定义del(.deviceId)了方式,因此没有必要这样做。+

输出

{
  "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
}

推荐阅读