Heim >Backend-Entwicklung >Golang >Wie kann ich JSON basierend auf einem dynamischen Feldwert in Go-Schnittstellen entmarshalieren?
Unmarshalling von JSON in Schnittstellen in Go
Stellen Sie sich das Szenario vor, in dem Sie eine JSON-Zeichenfolge mit unterschiedlichen Datenstrukturen abhängig von einem bestimmten Feld haben, z als „cmd“-Feld. Sie möchten diesen JSON in eine Go-Struktur entmarshalieren, die ein Feld mit einem Interface{}-Typ enthält, und ihn basierend auf dem „cmd“-Wert an verschiedene Datenstrukturen anpassen.
Lösung
Um dies zu erreichen, definieren Sie eine Basisstruktur mit festen Feldern und einem json.RawMessage-Feld, um die Variantendaten zu speichern. Erstellen Sie dann spezifische Strukturtypen für jede Variante und entpacken Sie sie basierend auf dem Befehl.
Zum Beispiel:
type Message struct { Cmd string `json:"cmd"` Data json.RawMessage } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` } func main() { var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) } switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal([]byte(m.Data), &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") } }
In diesem Beispiel stellt die Nachrichtenstruktur die gesamte Nachrichtenstruktur dar, die Folgendes enthält: das „cmd“-Feld und ein json.RawMessage-Feld zur Aufnahme der Variantendaten. CreateMessage ist ein spezifischer Strukturtyp, der die Befehlsvariante „create“ darstellt.
Der Code entpackt die anfängliche JSON-Zeichenfolge in eine Nachrichtenvariable und verwendet dann das „cmd“-Feld, um zu bestimmen, welche spezifische Variante entpackt und gedruckt werden soll.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON basierend auf einem dynamischen Feldwert in Go-Schnittstellen entmarshalieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!