JSON到數據表:如何避免NULL列被自動刪除?大家好,
我正在使用 JMP 15 並讓 JSL 通過 Http Request() 檢索 JSON 有效負載,通過 Char to Blob() 運行它,然後在數據表中 open() 它。 JSON 負載內容是動態的,但始終可映射為表格格式(行和列)。
問題:如果 JSON 中的任何鍵都具有 NULL 值,則它們不會包含在數據表中(即,不會為這些鍵創建任何列)。 這是有問題的,因為我希望 JSON 中的所有鍵都顯示為數據表中的列,無論所有值是否為 NULL。
如果我將有效負載保存在本地文件中並直接使用 Open() 打開它,我會得到所需的結果:一個數據表,其中所有鍵都轉換為列,並且所有 NULL 值都顯示為 NULL。 但是,這不適用於我的用例。
這是複制該問題的基本 JSL。 我使用 Load Text File() 檢索數據,而不是 Http Request(),這給出了相同的結果。 附加文件“data.json”。
dt1 = Open("/Users/abc/data.json", JSON ); // works as desired
raw = Load Text File("/Users/abc/data.json");
jsonblob = Char To Blob( raw );
dt2 = open(jsonblob, "JSON", Guess("wide")); // does not work as desired -- drops all-NULL columns誰能建議一種將變量中的 JSON 轉換為保留全 NULL 鍵的數據表的方法?
謝謝!
安迪
分享和交流結果回复:JSON 到數據表:如何避免 NULL 列被自動刪除?沒有元素的 JSON 數組對於 JMP 來說是有問題的。一種選擇是用至少有一個子級的數組替換空數組。您可以將該子項設為空或使用缺失值字符 - [.]。我認為這意味著您將不再擁有有效的 JSON,但 JMP 16 仍會讀取它,並且目前沒有計劃破壞該行為。使用 null 將創建字符列,使用缺失值將創建數字列。如果您知道 JSON 中沒有包含 [] 的字符串數據,那麼您可以簡單地進行此更改
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
如果您確實想防止在 JSON 字符串中替換 [],則需要多幾行 jsl 來跳過字符串,但應該不會太難。
回复:JSON 到數據表:如何避免 NULL 列被自動刪除?感謝您的備註, @Craige_Hales 。我已向開發團隊報告了第 1 條中指出的缺陷,以便在 JMP 的未來版本中考慮。
就其價值而言,這些似乎不會刪除 JMP 14.3 中的空列。
raw = Load Text File( "$DOWNLOADS/data.json" );
jsonblob = Char To Blob( raw );
dt2 = Open( jsonblob, "JSON", Guess( "wide" ) );
JSON To Data Table( raw, Guess( "wide" ) );
回复:JSON 到數據表:如何避免 NULL 列被自動刪除?如果您可以控制 json 的源並且可以將其作為真正的 pandas 格式獲取,
orient='table' (in python code)
可能是一個不錯的選擇。 JMP 的導入可以使用其中一些元數據。 JMP 也可以讀取其他方向。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
回复:JSON 到數據表:如何避免 NULL 列被自動刪除?- 好的,我認為寬選項是正確的選擇,並且從導入中刪除所有缺失的列是一個錯誤。@Wendy_Murphrey這肯定會讓事情變得複雜。
- 如果您知道所有可能的列,並且 JSON 中只有一個子集,則可以在 JSON 設置中列出所有這些列。 首先做一個小測試,看看它是否按照您需要的方式工作(我不確定您是否會獲得完整的列集或僅獲得 JSON 中出現的子集。)
- 仍然可以訪問以前版本的 JSON 導入代碼;指定 JSON(不帶 JSON SETTINGS 或 Guess 參數)可能會執行您想要的操作。
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- JSON 看起來與任何 pandas 格式都不完全相同。 但 pandas 選項似乎確實檢索了您想要的列名;如果沒有其他辦法,這可能是動態創建 JSON 設置的起點,以便第二次導入真正獲取數據。
- 據我所知,沒有關於 JSON 設置的具體文檔;它旨在由嚮導編寫並且仍然是人類可讀的。 它與嚮導對話框值匹配,並且那裡有一些文檔。
- 我很確定 ImportSettings 是由 CSV 導入使用的,也許還有其他東西。 JSON 嚮導不使用它們。
(更新:一些小修改)
回复:JSON 到數據表:如何避免 NULL 列被自動刪除?感謝您的建議,克雷格。 我嘗試了它們並有一些後續問題:
1.將Guess從“wide”更改為“pandas”確實成功地在數據表中包含了NULL列——不幸的是,它引入了一個新問題:數據表的每一行都重複了JSON數據的最後“行”(參見附件“pandas.png”——批號 21055 重複兩次,批號 21054 不包括在內。 我用更大的數據集複製了相同的行為)。
是否有任何其他 Open() 參數或配置可以糾正此問題?
2. 我能夠使用嚮導成功導入 data.json 文件,包括 NULL 列——但是,它生成的腳本特定於 data.json 中的有效負載(請參閱附件中的“script_view.png”)。 我的用例更為一般——我的 JSL 接收的有效負載在列數和列標籤方面會有所不同。 有沒有辦法使用嚮導的輸出來創建更通用的配置選項? 或者是我手動迭代有效負載並逐列構建數據表的唯一選擇?
2b. 與此相關——您能給我指出有關在 Open() 中使用“JSON 設置”參數的任何文檔嗎? 我在語法參考或腳本索引中找不到任何內容(當我搜索“JMP JSL“JSON 設置””時,最熱門的是我在此論壇上的上一個問題)。
3. 有沒有辦法強制 Open() 將空列導入為數字? 我在導入設置中嘗試了“將空列視為數字 (1)”,它導致 data.json 文件被視為單行/記錄(請參閱“pandas_numeric.png,附件),所以我假設我正在做有什麼不正確的。
謝謝!
安迪
回复:JSON 到數據表:如何避免 NULL 列被自動刪除?我在下面寫了一個可能有幫助的答案,然後我意識到有一個簡單的答案你應該首先嘗試。 該數據似乎是 pandas 格式之一,因此將“wide”更改為“pandas”。
如果結果是錯誤的,請嘗試...
使用嚮導顯式選擇列,然後使用該腳本。
You'll probably want the stack option too.You'll probably want the stack option too.您可能也需要堆棧選項。
我還將行生成器從 root 更改為 items,因為它更正確一些。 可能不會產生真正的影響。
為“行”選擇的項目會導致每次出現該項目時都會將新行寫入數據表。 打開統計,你可以看到重複2次的項目。