代码之家  ›  专栏  ›  技术社区  ›  Milister

解析JSON文件jq[重复]

  •  1
  • Milister  · 技术社区  · 7 年前

    整个文件: https://1drv.ms/u/s!AizscpxS0QM4hJpEkp12VPHiKO_gBg

    使用此命令,我获得以下部件(获取最新作业)

    jq '.|[ .executions[] | select(.job.name != null) | select(.job.name) ]
         | sort_by(.id)
         | reverse
         | .[0] ' 1.json
    
    
    
    {
      "argstring": null,
      "date-ended": {
        "date": "2018-04-03T17:43:38Z",
        "unixtime": 1522777418397
      },
      "date-started": {
        "date": "2018-04-03T17:43:34Z",
        "unixtime": 1522777414646
      },
      "description": "",
      "executionType": "user",
      "failedNodes": [
        "172.30.61.88"
      ],
      "href": "http://172.30.61.88:4440/api/21/execution/126",
      "id": 126,
      "job": {
        "averageDuration": 4197,
        "description": "",
        "group": "",
        "href": "http://172.30.61.88:4440/api/21/job/271cbcec-5042-4d52-b794-ede2056b2ab8",
        "id": "271cbcec-5042-4d52-b794-ede2056b2ab8",
        "name": "aa",
        "permalink": "http://172.30.61.88:4440/project/demo/job/show/271cbcec-5042-4d52-b794-ede2056b2ab8",
        "project": "demo"
      },
      "permalink": "http://172.30.61.88:4440/project/demo/execution/show/126",
      "project": "demo",
      "status": "failed",
      "user": "administrator"
    

    我设法提取了工作名称和状态,现在想结束日期。日期

    jq '.|[ .executions[] |select(.job.name != null) | select(.job.name) ]
         | sort_by(.id)
         | reverse 
         | .[0]
         | "\(.status), \(.job.name)"' 1.json
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   peak    7 年前

    使用“-r”命令行选项,以下过滤器:

     [.executions[] | select(.job.name != null)]
     | sort_by(.id)
     | reverse 
     | .[0]
     | [.status, .job.name, ."date-ended".date]
     | @csv
    

    产生:

    "failed","aa","2018-04-03T17:43:38Z"
    

    您可能忽略了一点,即“-”是一个“特殊”字符,它可以表示否定或减法。

    如果jq不支持语法 ."date-ended".date ,则可以返回到基本语法: (.["date-ended"] | .date)

        2
  •  0
  •   axiac    7 年前

    我想你在提取 .date-ended.date 因为名称包含破折号,破折号由 jq 作为减法。

    解决方案列在 documentation :

    如果键包含特殊字符,则需要用双引号将其括起来,如下所示: ."foo$" ,否则 .["foo$"]

    这意味着您的 jq公司 计划应为:

    "\(.status), \(.job.name), \(."date-ended".date)"