Heim > Backend-Entwicklung > Golang > Wie kann ich JSON effektiv in eine Schnittstelle{} in Go entmarshalieren?

Wie kann ich JSON effektiv in eine Schnittstelle{} in Go entmarshalieren?

DDD
Freigeben: 2024-12-30 03:50:09
Original
144 Leute haben es durchsucht

How to Effectively Unmarshal JSON into an Interface{} in Go?

Unmarshaling von JSON in die Schnittstelle{} in Go: Eine detaillierte Anleitung

Zu verstehen, wie man JSON in eine Schnittstelle entmarshaling{} ist eine entscheidende Fähigkeit für Go-Entwickler. In diesem Artikel gehen wir ein praktisches Beispiel durch, das die Fallstricke und Lösungen hervorhebt, die mit dem Unmarshaling von JSON in eine Struktur mit einem Interface{}-Feld verbunden sind.

Beachten Sie die folgenden Typdefinitionen:

type Message struct {
    Cmd string `json:"cmd"`
    Data interface{} `json:"data"`
}

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}
Nach dem Login kopieren

Angenommen eine JSON-Zeichenfolge, die eine Erstellungsnachricht darstellt, versuchen wir möglicherweise, sie in eine Nachricht zu dekodieren struct:

{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
Nach dem Login kopieren
import "encoding/json"

var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`)

var m Message
if err := json.Unmarshal(data, &m); err != nil {
    log.Fatal(err)
}
Nach dem Login kopieren

Bei der Untersuchung der nicht gemarshallten Nachrichtenstruktur stellen wir fest, dass das Datenfeld als Map[string]interface{} erhalten bleibt:

{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}
Nach dem Login kopieren

Überwindung der Schnittstelle {} Fallstrick

Um diese Einschränkung zu überwinden, wenden wir einen zweigleisigen Ansatz an Ansatz:

  1. Definieren Sie einen Strukturtyp für den festen Teil der Nachricht. Dazu gehören das cmd-Feld und ein json.RawMessage-Feld, um den Variantenteil der Nachricht zu erfassen.
  2. Definieren Sie Strukturtypen für jeden der Variantentypen.In unserem Fall definieren wir eine CreateMessage struct.
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"`
}  
Nach dem Login kopieren

Mit diesen Modifikationen können wir die Variantendaten basierend auf dem Befehl in den entsprechenden Strukturtyp dekodieren:

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

Durch den Einsatz dieser Technik können wir Entmarshamren Sie die JSON-Daten erfolgreich in die Nachrichtenstruktur, wobei das Feld „Daten“ den Variantentyp „CreateMessage“ enthält. Eine vollständige Implementierung finden Sie im bereitgestellten Playground-Beispiel.

Das obige ist der detaillierte Inhalt vonWie kann ich JSON effektiv in eine Schnittstelle{} in Go entmarshalieren?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage