Heim >Backend-Entwicklung >Golang >Wie kann ich JSON basierend auf einem dynamischen Feldwert in Go-Schnittstellen entmarshalieren?

Wie kann ich JSON basierend auf einem dynamischen Feldwert in Go-Schnittstellen entmarshalieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-21 20:01:11659Durchsuche

How to Unmarshal JSON into Go Interfaces Based on a Dynamic Field Value?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn