Marshaling von JSON in eine Schnittstelle in Go
Beim Umgang mit komplexen Datenstrukturen ist es oft notwendig, JSON in eine Schnittstelle zu marshalieren{} ermöglichen Flexibilität und Polymorphismus. Dieser Artikel bietet eine Lösung für ein bestimmtes Szenario, in dem Sie JSON in eine Schnittstelle{} einmarshallen und es basierend auf dem Wert eines Felds dynamisch in einen bestimmten Typ konvertieren möchten.
Problembeschreibung
Stellen Sie sich die folgende Situation vor: Sie haben einen Nachrichtentyp mit einem Interface{}-Feld namens „Daten“. Sie haben auch einen CreateMessage-Typ, der eine bestimmte Variante des Datenfelds darstellt. Beim Unmarshaling einer JSON-Zeichenfolge, die sowohl einen Befehl („in diesem Fall „create“) als auch Daten enthält, die dem Typ „CreateMessage“ entsprechen, tritt das Problem auf, dass Daten als Schnittstelle verbleiben{}.
Lösung
Um dieses Problem zu lösen, müssen Sie das Typsystem von Go und die Flexibilität von JSON nutzen. Definieren Sie einen neuen Strukturtyp, Message, der den ursprünglichen Message-Typ einbettet und ein RawMessage-Feld namens Data hinzufügt. RawMessage ist ein spezieller Typ, der vom Paket „encoding/json“ bereitgestellt wird und es Ihnen ermöglicht, beliebige JSON-Daten zu speichern, ohne Typinformationen zu verlieren.
type Message struct { Cmd string Data json.RawMessage }
Als nächstes definieren Sie hier einen Strukturtyp für jede Variante des Datenfelds Fall, CreateMessage:
type CreateMessage struct { Conf map[string]int Info map[string]int }
Jetzt können Sie in Ihrem Unmarshaling-Code den Wert des Cmd-Felds einschalten und die Daten in dekodieren geeigneter konkreter Typ:
switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal(m.Data, &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") }
Mit diesem Ansatz können Sie JSON in eine Schnittstelle entmarshalieren{} und gleichzeitig die Möglichkeit behalten, es später basierend auf einem bekannten Wert in einen bestimmten Typ zu konvertieren.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON in eine Go-Schnittstelle{} einbinden und dynamisch in einen bestimmten Typ konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!