使用變數陣列傳回解組JSON
從外部來源擷取JSON 時,回應的結構可能會有所不同,這使得解組具有挑戰性到一個固定的Go 結構體。當 JSON 可能包含相同屬性的陣列或單一物件時,這一點尤其明顯。
在提供的範例中,JSON 回應包含一個名為「gwrcmd」的屬性,該屬性可以是物件數組,也可以是單一的物件。為了解決這個問題,一種方法是建立第二個結構,其欄位與原始結構相同,但帶有「gwrcmd」屬性的切片。但是,可以使用 json.RawMessage 實現更靈活的解決方案。
json.RawMessage 允許將未知類型解組為原始 JSON 字串。此功能可用於查看 JSON 並確定將其解組為相應 Go 類型的適當方法。
考慮以下簡化範例:
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` } A A `json:"-"` As []A `json:"-"` } type A struct { B string } 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.RawMessage 欄位 RawA 擷取「a」屬性的 JSON 值。根據原始 JSON 的第一個位元組,我們可以確定該值是數組([])還是物件(“{”)。然後,使用此資訊將值解組到 A 結構(對於物件)或 As 切片(對於陣列)中。
此方法提供了一種更靈活、更健壯的方法來處理具有可變結構的 JSON 響應。它消除了對重複結構的需要,並允許基於 JSON 內容進行動態解組。
以上是在 Go 中解組 JSON 時如何處理變數數組回傳?的詳細內容。更多資訊請關注PHP中文網其他相關文章!