在Go 中解碼具有可變結構的JSON 資料
在處理來自第三方來源的JSON 資料時,遇到以下情況並不少見:資料的結構可能會有所不同。這對使用結構將 JSON 解組為特定資料類型的 Go 程式提出了挑戰。
考慮 JSON 回應可能包含特定屬性中的單一元素或陣列的情況,例如「gwrcmd」在這個範例中。如果「gwrcmd」總是單一元素,則像下面這樣的結構是合適的:
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string } } } } }
但是,如果「gwrcmd」有時是一個數組,我們將在解組過程中遇到錯誤。
使用json.RawMessage 實現靈活性
常見方法處理可變結構JSON 資料的方法是使用json.RawMessage,它允許我們捕獲任意JSON 值,而無需指定特定類型。一旦我們有了原始值,我們就可以檢查它並決定如何進一步解組它。
type Response struct { Gwrcmds struct { Gwrcmd json.RawMessage } }
在 Response 結構的 UnmarshalJSON 方法中,我們可以檢查 Gwrcmd 的內容並將其解組到適當的位置。類型:
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.Gwrcmds); err != nil { return err } if r.Gwrcmds.Gwrcmd[0] == '[' { return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsArray) } return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsSingle) }
在這種情況下,我們透過為陣列和單元素場景建立單獨的欄位來處理它們,基於原始值的內容進行解組。
替代方法
雖然 json.RawMessage 提供了靈活性,但它需要手動處理資料結構,並且可能不適合在所有情況下。替代方法包括:
最佳方法取決於應用程式的特定要求和 JSON 資料的複雜性。
以上是如何在 Go 中高效處理可變 JSON 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!