【问题标题】:Compare 2 JSON-files and create a new key if values match比较 2 个 JSON 文件并在值匹配时创建一个新键
【发布时间】:2020-03-25 22:34:47
【问题描述】:

我有两组 JSON 文件,如下所示,data-A.jsondata-B.json

我需要以某种方式将data-A.json 中的密钥URLdata-B.json 中的相同密钥进行比较。如果匹配,则从 data-A.json 中的键 Position 获取数据,并写入 data-B.json 中的新键 PreviousPosition。如果没有匹配的URL,则在data-B.json中为这个新键写一个空值

请看例子:

data-A.json

[
    {
        "Position": "1",
        "TrackName": "One hit wonder",
        "URL": "https://domain.local/xyz123"
    },
    {
        "Position": "2",
        "TrackName": "Random song",
        "URL": "https://domain.local/123qwe"
    },
    {
        "Position": "3",
        "TrackName": "Dueling banjos",
        "URL": "https://domain.local/asd456"
    }
]

数据-B.json

[
    {
        "Position": "1",
        "TrackName": "Rocket",
        "URL": "https://domain.local/nbs678"
    },
    {
        "Position": "2",
        "TrackName": "Dueling banjos",
        "URL": "https://domain.local/asd456"
    },
    {
        "Position": "3",
        "TrackName": "One hit wonder",
        "URL": "https://domain.local/xyz123"
    }
]

(所需)data-B.json

[
    {
        "Position": "1",
        "TrackName": "Rocket",
        "URL": "https://domain.local/nbs678",
        "PreviousPosition": null
    },
    {
        "Position": "2",
        "TrackName": "Dueling banjos",
        "URL": "https://domain.local/asd456",
        "PreviousPosition": "3"
    },
        {
        "Position": "3",
        "TrackName": "One hit wonder",
        "URL": "https://domain.local/xyz123",
        "PreviousPosition": "1"
    }
]

我已经做了一些平庸的尝试来使用jq 解决这个问题,但没有运气。还尝试了一些 PowerShell 和 Python,但我就是想不通。

有什么建议吗?

【问题讨论】:

    标签: json dictionary parsing jq


    【解决方案1】:

    如果您正在寻找一个简单的两行解决方案,那么 jq 是一个不错的选择:

    (INDEX($A[]; .URL) | map_values(.Position)) as $dict
    | map( .PreviousPosition = $dict[ .URL ] )
    

    这可能比看起来更简单,因为第一行中的表达式是创建字典的常见习语(即INDEX(...) | map_values(...))。在第一行中,假设 $A 将 JSON 保存在 data-A.json 中。

    第二行只是应用问题中指定的查找规则。

    这里唯一棘手的一点是正确调用命令行。以下内容就足够了:

    jq --argfile A data-A.json -f program.jq data-B.json
    

    其中 program.jq 包含上述两行程序。

    【讨论】:

    • 谢谢,完全按照我的意愿工作!一个快速的后续问题:是否可以复制比Position 更多的密钥?假设我在data-A.json 中还有一个名为customValue 的键,需要根据与上述相同的规则将其复制到data-B.json 中的同名键。我怎样才能做到这一点?
    • 您可以按照此处所示的相同方式创建和使用第二个字典,但创建单个字典可能更有效。
    猜你喜欢
    • 2021-08-07
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多