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
DDDOriginal
2024-12-30 03:50:09133Durchsuche

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"`
}

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}}
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)
}

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]]}

Ü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"`
}  

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")
    }
}

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!

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