簡體   English   中英

JSON 不會在 Unix 中使用 jq 進行轉換

[英]JSON will not convert with jq in Unix

轉換此 JSON 時遇到困難。 它是多行的,類似於下面的內容。 底部的示例數據是解壓縮后讀取的內容。

已嘗試的示例:

jq -r '(([["user_id","server_received_time","app","device_carrier","$schema","city","uuid","event_time","platform","os_version","amplitude_id","processed_time","user_creation_time","version_name","ip_address","paying","dma","group_properties","user_properties","client_upload_time","$insert_id","event_type","library","amplitude_attribution_ids","device_type","device_manufacturer","start_version","location_lng","server_upload_time","event_id","location_lat","os_name","amplitude_event_type","device_brand","groups","event_properties","data","device_id","language","device_model","country","region","is_attribution_event","adid","session_id","device_family","sample_rate","idfa","client_event_time"]]) + [(.table.All[] | [.user_id,.server_received_time,.app,.device_carrier,.$schema,.city,.uuid,.event_time,.platform,.os_version,.amplitude_id,.processed_time,.user_creation_time,.version_name,.ip_address,.paying,.dma,.group_properties,.user_properties,.client_upload_time,.$insert_id,.event_type,.library,.amplitude_attribution_ids,.device_type,.device_manufacturer,.start_version,.location_lng,.server_upload_time,.event_id,.location_lat,.os_name,.amplitude_event_type,.device_brand,.groups,.event_properties,.data,.device_id,.language,.device_model,.country,.region,.is_attribution_event,.adid,.session_id,.device_family,.sample_rate,.idfa,.client_event_time])])[]|@csv' test.json > test.csv

以及其他一些 jq 選項。 無論值如何,我都需要每一列,以及原樣的值。 有沒有人想過我們為什么會遇到問題? 我們得到的一個錯誤是:

jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:

其他 jq 行給出了以下錯誤:

string (...) cannot be csv-formatted, only array

這是 JSON 文件之一的摘錄:

{"groups":{},"country":"United States","device_id":"3d-88c-45-b6-ed81277eR","is_attribution_event":false,"server_received_time":"2019-12-17 17:29:11.113000","language":"English","event_time":"2019-12-17 17:27:49.047000","user_creation_time":"2019-11-08 13:15:32.919000","city":"Sure","uuid":"someID","device_model":"Windows","amplitude_event_type":null,"client_upload_time":"2019-12-17 17:29:21.958000","data":{},"library":"amplitude-js\/5.2.2","device_manufacturer":null,"dma":"Washington, DC (Townville, USA)","version_name":null,"region":"Virginia","group_properties":{},"location_lng":null,"device_family":"Windows","paying":null,"client_event_time":"2019-12-17 17:27:59.892000","$schema":12,"device_brand":null,"user_id":"email@gmail.com","event_properties":{"title":"Name","id":"1-253251","applicationName":"SomeName"},"os_version":"18","device_carrier":null,"server_upload_time":"2019-12-17 17:29:11.135000","session_id":1576603675620,"app":231165,"amplitude_attribution_ids":null,"event_type":"CHANGE_PERSPECTIVE","user_properties":{},"adid":null,"device_type":"Windows","$insert_id":"e308c923-d8eb-48c6-8ea5-600","event_id":24,"amplitude_id":515,"processed_time":"2019-12-17 17:29:12.760372","platform":"Web","idfa":null,"os_name":"Edge","location_lat":null,"ip_address":"123.456.78.90","sample_rate":null,"start_version":null}

謝謝!

你的嘗試有幾個問題。

首先,不能使用縮寫的.foo語法指定名稱中帶有“$”的鍵; 你可以使用.["$foo"]代替。

其次, @csv需要一個原子值數組。 因此,必須特別處理以 JSON 對象作為值的鍵。

第三,“+”不正確。 這里的相關連接符是“,”。

使用您的示例 JSON,以下內容將起作用:

(["user_id","server_received_time","app","device_carrier","$schema","city","uuid","event_time","platform","os_version","amplitude_id","processed_time","user_creation_time","version_name","ip_address","paying","dma","group_properties","user_properties","client_upload_time","$insert_id","event_type","library","amplitude_attribution_ids","device_type","device_manufacturer","start_version","location_lng","server_upload_time","event_id","location_lat","os_name","amplitude_event_type","device_brand","groups","event_properties","data","device_id","language","device_model","country","region","is_attribution_event","adid","session_id","device_family","sample_rate","idfa","client_event_time"]),

([.user_id,.server_received_time,.app,.device_carrier,.["$schema"],.city,.uuid,.event_time,.platform,.os_version,.amplitude_id,.processed_time,.user_creation_time,.version_name,.ip_address,.paying,.dma,.group_properties,.user_properties,.client_upload_time,.["$insert_id"],.event_type,.library,.amplitude_attribution_ids,.device_type,.device_manufacturer,.start_version,.location_lng,.server_upload_time,.event_id,.location_lat,.os_name,.amplitude_event_type,.device_brand,.groups,.event_properties,.data,.device_id,.language,.device_model,.country,.region,.is_attribution_event,.adid,.session_id,.device_family,.sample_rate,.idfa,.client_event_time]
 | map(if type=="object"
       then to_entries
       | map( "\(.key):\(.value)" )
       | join(";")
       else . end))
| @csv

不易出錯的解決方案

兩次指定長長的鍵列表會使上述解決方案容易出錯。 最好只指定一次鍵,然后以編程方式生成行。

這是一個可用於此目的的實用程序函數:

def toa($headers):
  . as $in | $headers | map($in[.]);

或者您可以處理toa的對象值鍵:

def toa($headers):
  def flat: 
     if type == "object" or type == "array"
     then to_entries | map( "\(.key):\(.value)" ) | join(";") 
     else .
     end;
  . as $in | $headers | map($in[.] | flat);

JSONL

如果輸入是問題中所示類型的 JSON 對象流,則有效的解決方案將使用帶有 -n 命令行選項的inputs 這可能是沿着以下路線:

print_header,
(inputs | print_row)

暫無
暫無

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

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