如何使用陣列或物件解組JSON
處理JSON 時,處理回傳資料可能是陣列或物件的場景物件可能具有挑戰性。本文解決了這個問題,並提出了一個解決方案,涉及使用 json.RawMessage 類型和基於 JSON 結構的動態解組。
揭開動態JSON 結構
考慮以下JSON 回應:
{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"
從回應中可以看出,gwrcmd物件或陣列。為了解決這個問題,自訂的Go 結構體定義為:
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string
解組難題
解決這個問題的關鍵在於利用json.RawMessage ,它接受任何JSON 值。我們在Response 結構中建立一個包裝器來保存原始JSON:
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` }
基於JSON 結構的動態解組
在Response 結構的Unmarshalhal>
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawAWrapper); err != nil { return err } if r.RawAWrapper.RawA[0] == '[' { return json.Unmarshal(r.RawAWrapper.RawA, &r.As) } return json.Unmarshal(r.RawAWrapper.RawA, &r.A) }
以上是當資料可能是數組或物件時,如何處理 JSON 解組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!