Heim > Backend-Entwicklung > Golang > Wie kann ich JSON in eine Go-Schnittstelle{} einbinden und dynamisch in einen bestimmten Typ konvertieren?

Wie kann ich JSON in eine Go-Schnittstelle{} einbinden und dynamisch in einen bestimmten Typ konvertieren?

Patricia Arquette
Freigeben: 2024-12-20 21:28:14
Original
724 Leute haben es durchsucht

How Can I Marshal JSON into a Go Interface{} and Dynamically Convert it to a Specific Type?

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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")
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage