JSON到數據表:如何避免NULL列被自動刪除?大家好,
我使用的是JMP 15,並且具有JSL,該JSL通過Http Request()檢索JSON有效負載,通過Char將其運行到Blob(),然後在數據表中open()s它。 JSON有效內容是動態的,但始終可映射為表格格式(行和列)。
問題是:如果JSON中的任何鍵都具有所有NULL值,則它們不包含在數據表中(即,沒有為這些鍵創建任何列)。 這是有問題的,因為無論所有值是否為NULL,我都希望將JSON中的所有鍵都顯示為數據表中的列。
如果將有效負載保存在本地文件中,然後使用Open()直接將其打開,則會得到所需的結果:一個數據表,其中所有鍵都轉換為列,並且所有NULL值都顯示為NULL。 但是,這不適用於我的用例。
這是複制問題的基本JSL。 代替Http Request(),我使用Load Text File()檢索數據,該結果相同。 附件為“ 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轉換為保留全空鍵的數據表的方法嗎?
謝謝!
安迪
腳本編寫回复:JSON到數據表:如何避免NULL列被自動刪除?我在下面寫了一個可能有幫助的答案,然後我意識到有一個簡單的答案應該首先嘗試。 數據似乎是大熊貓格式之一,因此請將“ wide”更改為“ pandas”。
如果發現錯誤,請嘗試...
使用嚮導明確選擇列,然後使用該腳本。
您可能還需要stack選項。
我還將行生成器從根目錄更改為項,因為它更加正確。 可能不會帶來真正的改變。
為“行”選擇的項導致每次發生新行時,都會將新行寫入數據表。 打開統計信息,您會看到重複2次的項目。
回复:JSON到數據表:如何避免NULL列被自動刪除?感謝您的建議,Craige。 我嘗試了它們,並提出了一些後續問題:
1.將Guess從“ wide”更改為“ pandas”確實可以在數據表中成功包含NULL列-不幸的是,這引入了一個新問題:JSON數據的最後“行”對於數據表的每一行都重複一次(參見附件中的“ pandas.png”-批次編號21055重複兩次,並且不包含批次編號21054。 我用更大的數據集複製了相同的行為)。
是否還有其他Open()參數或配置可以糾正此問題?
2.我能夠使用嚮導成功導入data.json文件,包括NULL列-但是,它生成的腳本特定於data.json中的有效負載(請參見“ script_view.png”,已隨附)。 我的用例比較籠統-我的JSL接收到的有效負載在列數和列標籤上會有所不同。 有沒有一種方法可以使用嚮導的輸出來創建更通用的config選項? 還是我唯一的選擇手動遍歷有效負載並逐列構造數據表?
2b。 與此相關-您能否指出我有關在Open()中使用“ JSON設置”參數的任何文檔? 我在“語法參考”或“腳本編制索引”中找不到任何內容(當我用Google搜索“ JMP JSL“ JSON設置””時,最熱門的是我在該論壇上遇到的問題)。
3.有沒有一種方法可以強制Open()將空列導入為Numeric? 我在“導入設置”中嘗試了“將空列作為數字處理(1)”,這導致data.json文件被視為單行/記錄(請參見“ pandas_numeric.png,已附加”),所以我假設我在做不正確的東西。
謝謝!
安迪
回复:JSON到數據表:如何避免NULL列被自動刪除?- 好的,我認為wide選項是使用的正確選項,並且從導入中刪除了所有缺失的列是一個錯誤。@溫迪·墨菲(Wendy_Murphrey)這無疑使事情變得複雜。
- 如果您知道所有可能的列,並且JSON中只有一個子集,則可以在JSON設置中列出所有它們。 首先做一個小測試,看看它是否可以按照您需要的方式工作(我不確定您是否將獲得完整的列集或僅顯示在JSON中的子集。)
- 仍然可以訪問JSON導入代碼的先前版本;指定JSON(不使用JSON SETTINGS)可以完成您想要的操作。
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- JSON看起來與任何熊貓格式都不完全相同。 但是pandas選項似乎確實可以檢索到您想要的列名。如果沒有其他方法可行,那麼這可能是動態創建JSON設置以進行第二次導入以真正獲取數據的起點。
- 據我所知,關於JSON設置,沒有任何具體文檔;它旨在由嚮導編寫,並且仍然易於閱讀。 它與嚮導對話框的值匹配,並且那裡有一些文檔。
- 我敢肯定CSV導入會使用ImportOptions,也許還有其他用途。 JSON嚮導不使用它們。
回复:JSON到數據表:如何避免NULL列被自動刪除?而且,如果您可以控制json的來源,並且可以將其獲取為真正的熊貓格式,
orient='table' (in python code)
可能是一個不錯的選擇。 JMP的導入可以使用其中一些元數據。 JMP也可以讀取其他方向。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
回复:JSON到數據表:如何避免NULL列被自動刪除?感謝您的來信, @Craige_Hales 。我已將項目1中指出的缺陷報告給開發團隊,以供將來的JMP版本考慮。
值得一提的是,這些似乎並沒有刪除JMP 14.3中的null列。
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數組對於JMP來說是有問題的。一種選擇是將空數組替換為具有至少一個子級的數組。您可以將該子級設置為null或使用缺失值字符-[。]。我認為這意味著您將不再擁有有效的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來跳過字符串,但仍然應該不太困難。