Typzusicherungen mit nicht gemarshallten Daten
In einem verteilten System werden Daten oft als JSON-Strings ausgetauscht. Beim Abrufen von JSON-Daten aus einer Nachrichtenwarteschlange kann es vorkommen, dass Sie die Daten in eine Schnittstelle deserialisieren{} und dann Typzusicherungen durchführen müssen, um den tatsächlichen Strukturtyp der Daten zu bestimmen.
Problem
Wenn Sie die empfangene JSON-Zeichenfolge in eine Schnittstelle {} entmarshallen und versuchen, das Ergebnis zu bestätigen, kann es zu einem unerwarteten Ergebnis kommen. Anstelle des erwarteten Strukturtyps erhalten Sie eine Map[string]Schnittstelle{}.
Lösung
Das Standardverhalten des JSON-Unmarshalings in eine Schnittstelle{} ergibt Typen wie bool, float64, string, []interface{} und map[string]interface{}. Da Something1 und Something2 benutzerdefinierte Strukturen sind, werden sie vom JSON-Unmarshaler nicht erkannt.
Um dieses Problem zu beheben, gibt es zwei Hauptansätze:
1. Direktes Unmarshalieren in benutzerdefinierte Strukturen
Code:
var input Something1 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here var input Something2 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here
2. Von der Kartenoberfläche auspacken
Code:
var input interface{} json.Unmarshal([]byte(msg), &input) // Unpack the data from the map switch v := input.(type) { case map[string]interface{}: // Extract the data from the map and assign it to custom structs }
Erweiterter Ansatz
Für eine vielseitigere Lösung: Erwägen Sie die Erstellung einer „Unpacker“-Struktur, die das Unmarshaling und die Typzusicherung übernimmt Prozess.
Code:
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
Fazit
Mit einem dieser Ansätze können Sie den Typ erfolgreich durchführen Behauptungen für Daten, die zuerst aus einem JSON-String in eine Schnittstelle{} entmarshallt werden. Die Wahl des Ansatzes hängt von den spezifischen Anforderungen Ihrer Anwendung ab.
Das obige ist der detaillierte Inhalt vonWie führe ich Typzusicherungen für nicht gemarshaltete JSON-Daten in Go durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!