【问题标题】:Combining JSON by common key-value pairs通过通用键值对组合 JSON
【发布时间】:2018-10-22 02:34:30
【问题描述】:

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

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 的嵌套数据只有两层深,但需要与嵌套一层深的数据相结合。

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

【问题讨论】:

    标签: json join jq


    【解决方案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
    

    产生如下所示的输出。

    请注意,字典中的引用对象包含完整的对象(包括“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
    }
    

    【讨论】:

    • 这非常棒!非常感谢。我还有一个额外的问题。您如何建议我从 python 3 以这种方式调用 jq?我可以使用 subprocess 模块,但如果存在更好的方法,我愿意做事。
    • 来自 jq 常见问题解答:?:哪些语言绑定可用于 Python? A: pip install jq #详情见pypi.python.org/pypi/jq pip install pyjq #详情见pypi.python.org/pypi/pyjq
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2021-06-16
    • 2019-09-12
    相关资源
    最近更新 更多