Go 中不使用Double Unmarshaling 解析JSON
在Go 中,你可能會遇到這樣的情況:你想在不使用Double Unmarshaling 的情況下解析不同類型的JSON 資料解組兩次。讓我們探討一下所涉及的步驟:
第1 步:解組為通用映射
正如您所提到的,第一步是將JSON 解組為通用映射[string ]介面{}。這提供了類似地圖的結構,其中鍵是字串,值是可以保存各種資料結構的動態介面類型。
第 2 步:識別鍵和值類型
獲得映射後,迭代它以查找您感興趣的鍵。根據值類型,您可以繼續下一步步驟。
第3 步:直接處理已知類型
如果值類型是已知結構,則可以直接對其進行轉換並將其用作所需的結構。例如,如果您有一個 Ping 結構,則可以檢查映射值是否可轉換為 Ping。如果 JSON 欄位名稱與結構欄位名稱相符且資料類型相容,則此方法效果很好。
第4 步:未知類型的替代方法
如果值類型未知或與您的預定義結構不相容,您可以採用以下方法:
改進的部分解組
為了避免雙重解組的需要,您可以部分地透過將值解組到json.RawMessage 而不是interface {} 來解組資料。 json.RawMessage 表示原始 JSON 值,稍後可以直接解組到所需的結構中。
程式碼範例
在您提供的範例中,您可以修改程式碼如下:
var myMap map[string]json.RawMessage ... switch k { case "ping": // ... case "ack": err = json.Unmarshal(v, &myAck) }
這種方法避免了當值類型時需要第二個解組步驟是已知的。但是,您仍然需要編寫 switch 語句來處理不同的情況。
以上是如何在 Go 中解析 JSON 而無需雙重解組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!