Json

在換行符分隔的 JSON 文件中將類型從字元串轉換為整數,處理 null

  • August 4, 2021

我們有以下以換行符分隔的 JSON:

{"leagueId": "1", "name": "the ballers"}
{"team": "2", "leagueId": "1", "name": "the hoopers"}
{"team": "3", "leagueId": "1", "name": "the gamerrs"}
{"team": "4", "leagueId": "1", "name": "the drivers"}
{"team": "5", "leagueId": "1", "name": "the jumpers"}
{"team": "6", "leagueId": "1", "name": "the riserss"}

team,leagueId都應該是整數,我們想修改這個 NDJSON,將這些字元串轉換為整數。我們要的輸出是:

{"leagueId": 1, "name": "the ballers"}
{"team": 2, "leagueId": 1, "name": "the hoopers"}
{"team": 3, "leagueId": 1, "name": "the gamerrs"}
{"team": 4, "leagueId": 1, "name": "the drivers"}
{"team": 5, "leagueId": 1, "name": "the jumpers"}
{"team": 6, "leagueId": 1, "name": "the riserss"}

假設我們知道/有一個需要從字元串轉換為整數的列的列表/數組

$$ team, leagueId $$,我們如何進行這種轉換?這可能與(a)使用類似工具的bash命令jq,或者(b)有一些python解決方案嗎?我們完整的 NDJSON 大小約為 10GB,性能很重要,因為這是我們日常數據攝取管道中的一個步驟。 編輯: 如果不是因為第一個 JSON 中的缺失值,jq -c '{leagueId: .leagueId | tonumber, team: .team | tonumber, name: .name}' tmp/testNDJSON.json > tmp/new_output.json這似乎會起作用……感謝任何幫助!team

jq  -c '.leagueId |= tonumber | (.team // empty) |= tonumber' file

這會將leagueId每個對象的 in 轉換為一個數字,然後轉換為team值(如果它存在且非空)。

泛化為將一組鍵轉換為數字(如果存在):

jq -c --argjson keys '["team", "leagueId"]' \
   '($keys[] as $key | .[$key] // empty) |= tonumber' file

用於jo創建該列表:

jq -c --argjson keys "$(jo -a team leagueId)"  \
   '($keys[] as $key | .[$key] // empty) |= tonumber' file

這裡發生的情況是,該語句.[$key] // empty用於一組$key字元串,從對像生成值,其中$key是具有非空值的現有鍵。然後將這些值轉換為數字。$key字元串取自命令行傳入的數組。

引用自:https://unix.stackexchange.com/questions/663348