JSON 編組和解組在使用介面類型時可能會帶來挑戰。本文深入探討了這些困難並提供了解決方案。
從介面類型封送很簡單,因為底層類型是本地已知的,允許反射器識別它。
然而,解組到介面類型是有問題的。在不知道具體類型的情況下,反射器無法實例化新實例來接收編組資料。
要解決此限制,一種方法是為自訂類型實作 Unmarshaler 介面。請參閱下面的範例:
import ( "encoding/json" "fmt" "log" ) // RawString represents a raw JSON object. type RawString string // Implement the Marshaler and Unmarshaler interfaces. func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { *m += RawString(data); return nil } // Example data. const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` // Example struct. type A struct { I int64 S RawString `sql:"type:json"` } func main() { a := A{} if err := json.Unmarshal([]byte(data), &a); err != nil { log.Fatal("Unmarshal failed:", err) } fmt.Println("Done:", a) }
在此範例中,RawString 實作了 Marshaler 和 Unmarshaler,允許自訂編組和解組。然後 main 函數使用 json.Unmarshal 將 JSON 資料解碼為 A 的實例。
以上是如何使用 Go 的介面類型有效處理 JSON 編組和解組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!