Dans RPC, le marshalling vers un type d'interface est simple puisque l'objet est local et que le réflecteur peut identifier son type sous-jacent. Cependant, la désorganisation d'un type d'interface présente un défi.
Le réflecteur ne peut pas déterminer le type concret à attribuer à la nouvelle instance qui recevra les données marshalées. Cette limitation s'applique à toutes les opérations de marshalling/unmarshalling.
Pour résoudre ce problème dans certains cadres, des informations supplémentaires sont fournies pour aider le réflecteur. Par exemple, dans Java Json(jackson), l'annotation JsonTypeInfo spécifie le type de classe.
Dans Go, l'implémentation de l'interface Unmarshaler pour votre type personnalisé peut relever ce défi. Prenons l'exemple suivant :
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) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!