RPC では、オブジェクトがローカルであり、リフレクターがその基礎となる型を識別できるため、インターフェイス型へのマーシャリングは簡単です。ただし、インターフェイス型へのアンマーシャリングには課題があります。
リフレクターは、マーシャリングされたデータを受け取る新しいインスタンスに割り当てる具体的な型を決定できません。この制限は、すべてのマーシャリング/アンマーシャリング操作に適用されます。
一部のフレームワークでこの問題を解決するために、リフレクターを支援する追加情報が提供されています。たとえば、Java Json(jackson) では、JsonTypeInfo アノテーションによってクラス タイプが指定されます。
Go では、カスタム タイプの Unmarshaler インターフェイスを実装することで、この課題に対処できます。次の例を考えてみましょう:
import ( "encoding/json" "errors" "fmt" "log" ) // RawString is a raw encoded JSON object. // It implements Marshaler and Unmarshaler and can // be used to delay JSON decoding or precompute a JSON encoding. type RawString string // MarshalJSON returns *m as the JSON encoding of m. func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } // UnmarshalJSON sets *m to a copy of data. func (m *RawString) UnmarshalJSON(data []byte) error { if m == nil { return errors.New("RawString: UnmarshalJSON on nil pointer") } *m += RawString(data) return nil } const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` type A struct { I int64 S RawString `sql:"type:json"` } func main() { a := A{} err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed", err) } fmt.Println("Done", a) }
以上がGo で JSON データをインターフェイス型にアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。