【问题标题】:Use jq to extract a subset of a nested object's fields?使用 jq 提取嵌套对象字段的子集?
【发布时间】:2022-11-24 05:45:33
【问题描述】:

我有一个包含 UN/LOCODE 数据的 26MB JSON 文件,我想从中重组和删除一些数据,以便它在我的应用程序的二进制包中占用更少的空间。

JSON 包含一个对象数组,如下所示:

{
    "Change": null,
    "Coordinates": "4234N 00135E",
    "Country": "AD",
    "Date": "0307",
    "Function": "--3-----",
    "IATA": null,
    "Location": "CAN",
    "Name": "Canillo",
    "NameWoDiacritics": "Canillo",
    "Remarks": null,
    "Status": "RL",
    "Subdivision": null
}

所需的结构是一个对象而不是数组,以国家和位置字段的串联为键,但我感兴趣的唯一嵌套字段是“名称”和“坐标”。

我已经能够完成第一步:

jq 'INDEX("\(.Country)-\(.Location)")'

给我:

{
    "AD-CAN": {
        "Change": null,
        "Coordinates": "4234N 00135E",
        "Country": "AD",
        "Date": "0307",
        "Function": "--3-----",
        "IATA": null,
        "Location": "CAN",
        "Name": "Canillo",
        "NameWoDiacritics": "Canillo",
        "Remarks": null,
        "Status": "RL",
        "Subdivision": null
   },
   ...
}

但我无法弄清楚如何从新顶级对象内的嵌套对象中仅获取所需的键。

如果这不能用jq完成,我将不得不求助于自定义脚本来完成它。

【问题讨论】:

  • @knittl 感谢您的编辑修复! :D

标签: jq


【解决方案1】:

只需使用 map_values 重塑对象:

jq 'INDEX("(.Country)-(.Location)") | map_values({Name, Coordinates})'

【讨论】:

    【解决方案2】:

    你可以使用map_values

    INDEX("(.Country)-(.Location)") | map_values({Name, Coordinates})
    

    输出:

    {
      "AD-CAN": {
        "Name": "Canillo",
        "Coordinates": "4234N 00135E"
      }
    }
    

    【讨论】:

    • 很好,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多