【问题标题】:JQ: key selection from numeric objectsJQ:从数字对象中选择键
【发布时间】:2019-08-26 15:59:37
【问题描述】:

我在 Windows 10 PowerShell 环境中使用 jq 1.6 并尝试从巧合的数字 json 对象中选择键。

Json 示例:

    {  
   "alliances_info":{  
      "744085325458334213":{  
         "emblem":3,
         "name":"wellwell",
         "member_count":1,
         "level":1,
         "military_might":1035,
         "public":false,
         "tag":"MELL",
         "slogan":"",
         "id":744085325458334213
      },
      "744128593839677958":{  
         "emblem":0,
         "name":"Brave",
         "member_count":1,
         "level":1,
         "military_might":1035,
         "public":false,
         "tag":"GABA",
         "slogan":"",
         "id":744128593839677958
      },
      "746034084459209223":{  
         "emblem":0,
         "name":"Queen",
         "member_count":1,
         "level":1,
         "military_might":1035,
         "public":false,
         "tag":"QUE",
         "slogan":"",
         "id":746034084459209223
      },
      "750446471312466445":{  
         "emblem":0,
         "name":"Phoenix Inc",
         "member_count":35,
         "level":6,
         "military_might":453369,
         "public":true,
         "tag":"PHOI",
         "slogan":"",
         "id":750446471312466445
      },
      "750446518934594062":{  
         "emblem":11,
         "name":"Australia",
         "member_count":44,
         "level":8,
         "military_might":957211,
         "public":true,
         "tag":"AUST",
         "slogan":"Go Australia",
         "id":750446518934594062
      }
   },
   "server_version":"v7.190.4-master.000000006"
}

我尝试了几个 jq 命令:

.alliances_info | .[] |  [{alliance_name: .name, alliance_count: .member_count, alliance_level: .level, alliance_power: .military_might, alliance_tag: .tag, alliance_slogan: .slogan, alliance_id: .id}]

.alliances_info | .. | objects |  [{alliance_name: .name, alliance_c
ount: .member_count, alliance_level: .level, alliance_power: .military_might, alliance_tag: .tag, alliance_slogan: .slog
an, alliance_id: .id}]

但总是出现 jq 错误:解析错误:第 1 行第 3 列的数字文字无效

我在第一个命令中放弃了对象 Building(并且只构建了一个数组),它可以工作。但我需要那个对象。有什么建议吗?

BR 蒂莫

【问题讨论】:

    标签: json jq


    【解决方案1】:

    您的第一个查询与给定的 JSON 样本完美配合。也许您错误地调用了 jq 。如果你在一个文件中有 jq 程序,比如 select.jq,你会像这样调用 jq:

    jq -f select.jq sample.json
    

    如果没有帮助,请尝试:

    jq empty sample.json
    

    如果失败,则可能是 JSON 的编码有问题。

    【讨论】:

    • 嗨,Peak,我知道第一个命令正在运行(在 jqplay 中)。我的问题是这不适用于 Windows 的 jq。我到了 jq: parse error: Invalid numeric literal at line 1, column 3
    【解决方案2】:

    我不确定我是否明白你想要什么。

    您的第一次尝试对我有用,但会在输入中为 JSON 值生成一个输出。也就是说,我创建了一个名为 so.json 的文件,并将您的 JSON 从上面放入其中:

    {
      "alliances_info": {
        "744085325458334213": {
          "emblem": 3,
    ⋮
    }
    

    当我运行你的程序时,我得到:

    $ jq '.alliances_info | .[] |  [{alliance_name: .name, alliance_count: .member_count, alliance_level: .level, alliance_power: .military_might, alliance_tag: .tag, alliance_slogan: .slogan, alliance_id: .id}]' so.json
    [
      {
        "alliance_name": "wellwell",
        "alliance_count": 1,
        "alliance_level": 1,
        "alliance_power": 1035,
        "alliance_tag": "MELL",
        "alliance_slogan": "",
        "alliance_id": 744085325458334200
      }
    ]
    [
      {
        "alliance_name": "Brave",
    ⋮
    ]
    

    如果你想要一个数组,你可能想要一个包含所有联盟的数组,如下所示:

    $ jq '.alliances_info | [ .[] | { alliance_name: .name, alliance_id: .id } ]' so.json
    [
      {
        "alliance_name": "wellwell",
        "alliance_id": 744085325458334200
      },
      {
        "alliance_name": "Brave",
        "alliance_id": 744128593839678000
      },
      {
        "alliance_name": "Queen",
        "alliance_id": 746034084459209200
      },
      {
        "alliance_name": "Phoenix Inc",
        "alliance_id": 750446471312466400
      },
      {
        "alliance_name": "Australia",
        "alliance_id": 750446518934594000
      }
    ]
    

    从左边开始, - .alliances_info 在其输入对象中查找名为“alliances_info”的字段并输出其值 - | next 说从左侧获取输出并将其作为输入传递到右侧。 - 在第一个| 之后,我有一个[ «jq expressions» ],它告诉jq 为每个输入创建一个JSON 数组输出;该数组的元素是该内部«jq expressions» 的输出 - 内部表达式以 .[] 开头,这意味着为输入对象中的每个 JSON 值(忽略键)生成一个输出。对我们来说,这将是名为"744085325458334213""744128593839677958"、……的对象 - 下一个 | 使用这些对象作为输入,并为每个对象生成一个 JSON 对象 { alliance_name: .name, alliance_id: .id }

    这就是为什么我最终得到一个包含 5 个 JSON 对象的 JSON 数组。

    据我所知,您大多只是重命名了一堆字段。为此,您可以这样做:

    $ jq --argjson renameMap '{ "name": "alliance_name", "member_count": "alliance_count", "level": "alliance_level", "military_might": "alliance_power", "tag": "alliance_tag", "slog": "alliance_slogan"}' '.alliances_info |= ( . | [ to_entries[] | ( .value |= ( . | [ to_entries[] | ( .key |= ( if $renameMap[.] then $renameMap[.] else . end ) ) ] | from_entries ) ) ] | from_entries )' so.json 
    {
      "alliances_info": {
        "744085325458334213": {
          "emblem": 3,
          "alliance_name": "wellwell",
          "alliance_count": 1,
          "alliance_level": 1,
          "alliance_power": 1035,
          "public": false,
          "alliance_tag": "MELL",
          "slogan": "",
          "id": 744085325458334200
        },
        "744128593839677958": {
          "emblem": 0,
          "alliance_name": "Brave",
          "alliance_count": 1,
          "alliance_level": 1,
          "alliance_power": 1035,
          "public": false,
          "alliance_tag": "GABA",
          "slogan": "",
          "id": 744128593839678000
        },
    ⋮
      },
      "server_version": "v7.190.4-master.000000006"
    }
    
    
    

    【讨论】:

    • 嗨科林,感谢您的解释。好吧,它比重命名要多一点(这是对数据库导入进行一些修改的第一步)。主要问题是该命令在 jqplay 中有效,但在 Windows 的 jq 下无效。
    【解决方案3】:

    我是个白痴(在这里完全清楚)。我找到了原因(这通常是无脑的......)。我从文件中读取输入,有趣的是该文件是 Unicode 但没有 UTF8。重新编码后,命令工作正常。感谢您的帮助。

    BR 蒂莫

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2020-02-23
      相关资源
      最近更新 更多