簡體   English   中英

如何使用 jq 將嵌套的 JSON output 轉換為 CSV?

[英]How do I use jq to convert nested JSON output to CSV?

I have a JSON output that I receive from cURL, I would like to pipe to jq to extract useful information and display the csv data in a terminal.

樣品 JSON 響應:

{
  "operation": "GET CLIENT SESSIONS",
  "outcome": "SUCCESS",
  "result": {
    "Session": [
      {
        "sessionID": "E1B7190EF32AA9F6E63265ADBB88D1A9D6F4254457A0.production",
        "requestID": "",
        "sessionPoolID": "8LNIVzRTSo-jJV-CdPMP0Q",
        "agentID": "",
        "ablSessionID": "",
        "lastAccessStr": "2022-04-01T10:36:14.745-0700",
        "elapsedTimeMs": 1675892,
        "sessionState": "AVAILABLE",
        "requestState": "READY",
        "sessionType": "SESSION_FREE",
        "adapterType": "APSV",
        "bound": false,
        "clientConnInfo": null,
        "agentConnInfo": null
      },
      {
        "sessionID": "E1B7190EF32AA9F6E63265ADBB88D1A9D6F4254457A0.production",
        "requestID": "",
        "sessionPoolID": "8LNIVzRTSo-jJV-CdPMP0Q",
        "agentID": "",
        "ablSessionID": "",
        "lastAccessStr": "2022-04-01T10:36:14.745-0700",
        "elapsedTimeMs": 1675892,
        "sessionState": "AVAILABLE",
        "requestState": "READY",
        "sessionType": "SESSION_FREE",
        "adapterType": "APSV",
        "bound": false,
        "clientConnInfo": null,
        "agentConnInfo": null
      }
    ]
  },
  "errmsg": "",
  "versionStr": "v1.0.0 ( 2021-10-29 )",
  "versionNo": 1
}

我可以使用此查詢提取信息:

jq '.result.Session[] | ([.lastAccessStr, .elapsedTimeMs, .clientConnInfo]) | @csv'

我遇到的問題,有時響應可能包含 clientConnInfo 和 agentConnInfo 的其他嵌套數據,如下例所示。

{
  "operation": "GET CLIENT SESSIONS",
  "outcome": "SUCCESS",
  "result": {
    "Session": [
      {
        "sessionID": "E1B7190EF32AA9F6E63265ADBB88D1A9D6F4254457A0.production",
        "requestID": "",
        "sessionPoolID": "8LNIVzRTSo-jJV-CdPMP0Q",
        "agentID": "",
        "ablSessionID": "",
        "lastAccessStr": "2022-04-01T10:36:14.745-0700",
        "elapsedTimeMs": 1675892,
        "sessionState": "AVAILABLE",
        "requestState": "READY",
        "sessionType": "SESSION_FREE",
        "adapterType": "APSV",
        "bound": false,
        "clientConnInfo": null,
        "agentConnInfo": null
      },
      {
        "sessionID": "26691913A73E55175D233F86D219B4AEFA4AD14AE9E4.production",
        "requestID": "ROOT:a:000002a6",
        "sessionPoolID": "8LNIVzRTSo-jJV-CdPMP0Q",
        "agentID": "qsrLXAxsRRanJio6dYOC2Q",
        "ablSessionID": "",
        "lastAccessStr": "2022-04-01T11:04:08.902-0700",
        "elapsedTimeMs": 1735,
        "sessionState": "RESERVED",
        "requestState": "RUNNING",
        "sessionType": "SESSION_FREE",
        "adapterType": "APSV",
        "bound": false,
        "clientConnInfo": {
          "clientName": "xxxxx",
          "requestID": "ROOT:a:000002a6",
          "sessionID": "26691913A73E55175D233F86D219B4AEFA4AD14AE9E4.production",
          "adapterType": "APSV",
          "reqStartTimeStr": "2022-04-01T11:04:08.902-0700",
          "elapsedTimeMs": 1735,
          "executerThreadId": "thd-8",
          "requestUrl": "xxxxx",
          "requestProcedure": "xxxxx.p",
          "httpSessionId": "26691913A73E55175D233F86D219B4AEFA4AD14AE9E4.production"
        },
        "agentConnInfo": {
          "agentID": "qsrLXAxsRRanJio6dYOC2Q",
          "connID": "AR2k7gnYSiKPCk2DEHpaSg",
          "connPoolID": "v0Lh7XcITsOSfoF_RjXXig",
          "state": "RESERVED",
          "agentAddr": "xxxxx",
          "localAddr": "xxxxx"
        }
      }
    ]
  },
  "errmsg": "",
  "versionStr": "v1.0.0 ( 2021-10-29 )",
  "versionNo": 1
}

如果我嘗試使用相同的查詢,它會因以下錯誤而死:

jq: error (at <stdin>:0): object ({"clientNam...) is not valid in a csv row

所需的 output 是為了捕獲這個:

.lastAccessStr.elapsedTimeMs.clientName(如果在輸出中可用).requestID(如果在輸出中可用).agentAddr(如果在輸出中可用).localAddr(如果在輸出中可用)

我一直在嘗試使用https://jqplay.org來完成這項工作,但沒有任何運氣。

誰能給我一些例子,說明我將如何讓 go 完成這項工作?

用戶pmf 在評論中得到了它:

使用? 忽略錯誤,並且//如果第一個錯誤是nullfalse或不存在,則提供替代方法。 按照(.clientConnInfo.clientName? // "none")的行定義問題中的每一列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM