Heim >Backend-Entwicklung >Golang >Wie kann ich JSON-Daten erfolgreich in Schnittstellentypen in Go entmarshalieren?
Unmarshalling für Schnittstellentypen
Eine der Herausforderungen in den RPC- und JSON-Paketen von Go ist das Unmarshalling für Schnittstellentypen. Lassen Sie uns dieses Problem analysieren und seine Lösung untersuchen.
Das Problem
Beim Versuch, das Marshaling für einen Schnittstellentyp aufzuheben, stoßen wir auf Fehler wie „json: Objekt kann nicht in Go entmarshaliert werden.“ Wert vom Typ main.Foo.“ Dies liegt daran, dass der Reflektor nicht den geeigneten konkreten Typ ermitteln kann, der für die eingehenden gemarshallten Daten instanziiert werden soll.
Die Lösung
Das Problem ergibt sich aus dem Mangel an verfügbaren Typinformationen den Reflektor beim Aussortieren. Während beispielsweise Marshalling von Schnittstellentypvariablen möglich ist, ist Unmarshalling nicht auf die Unfähigkeit des Reflektors zurückzuführen, den entsprechenden konkreten Typ zu identifizieren.
Um dieses Problem zu lösen, verwenden Frameworks wie Javas Json (Jackson) Annotationen, um zusätzliche bereitzustellen Typinformationen. In Go können wir jedoch die Unmarshaler-Schnittstelle für benutzerdefinierte Typen implementieren, um den Unmarshaling-Prozess selbst durchzuführen.
Unmarshaler implementieren
Hier ist ein Beispiel für die Implementierung der Unmarshaler-Schnittstelle für unser benutzerdefinierter Typ RawString:
type RawString string func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { *m += RawString(data) return nil }
Jetzt können wir JSON entmarshalieren Daten in eine RawString-Instanz:
const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` 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) }
Durch die Bereitstellung der Unmarshaler-Implementierung für unseren benutzerdefinierten Typ können wir JSON-Daten entmarshalieren, ohne dass der oben genannte Fehler auftritt.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Daten erfolgreich in Schnittstellentypen in Go entmarshalieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!