Heim > Backend-Entwicklung > Golang > Wie kann json.RawMessage beim Umgang mit heterogenen JSON-Strukturen doppeltes Unmarshaling in Go verhindern?

Wie kann json.RawMessage beim Umgang mit heterogenen JSON-Strukturen doppeltes Unmarshaling in Go verhindern?

Mary-Kate Olsen
Freigeben: 2024-12-27 21:34:10
Original
1012 Leute haben es durchsucht

How Can json.RawMessage Prevent Double Unmarshaling in Go When Handling Heterogeneous JSON Structures?

Mit RawMessage doppeltes Unmarshaling in Go vermeiden

In Go ist es bei der Arbeit mit JSON-Daten manchmal erforderlich, die Daten teilweise zu entmarshalieren, um auf unbekannte Felder zuzugreifen oder heterogene JSON-Strukturen verarbeiten. Allerdings kann dieser Prozess zu einem doppelten Unmarshaling führen, was ineffizient sein kann. In diesem Artikel wird eine Lösung zur Vermeidung dieses Problems mithilfe von json.RawMessage vorgestellt.

Stellen Sie sich ein Szenario vor, in dem eine Web-Socket-Verbindung verschiedene Arten von JSON-Nachrichten sendet und Sie diese in bekannte Strukturen entmarshalieren möchten. Der traditionelle Ansatz besteht darin, den JSON in ein generisches Map[string]interface{} zu entmarshalieren, nach dem gewünschten Schlüssel zu suchen und dann zu versuchen, den Wert in den gewünschten Typ umzuwandeln. Dieser Ansatz kann jedoch fehlschlagen, wenn mit verschachtelten JSON-Strukturen gearbeitet wird.

Um dieses Problem zu lösen, können wir die Werte nicht in interface{}, sondern in json.RawMessage entmarshalieren. Dadurch können wir auf die JSON-Rohdaten zugreifen, ohne die Typinformationen zu verlieren. Später können wir in der Switch-Anweisung die JSON-Rohdaten direkt in die gewünschte Struktur entmarshallen, ohne sie erneut marshalieren zu müssen.

import (
    "encoding/json"
    "fmt"
)

type Ping struct {
    Ping string `json:"ping"`
}

type Ack struct {
    Messages []Message `json:"messages"`
}

type Message string

func main() {
    testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`)
    var myAck = Ack{}
    var myMap map[string]json.RawMessage
    err := json.Unmarshal(testJSON, &myMap)
    if err != nil {
        fmt.Println("error unmarshalling: ", err)
    }

    for k, v := range myMap {
        fmt.Printf("key: %s, value: %s \n", k, v)

        switch k {
        case "ping":
            fmt.Println(k, " is a ping", v)
        case "ack":
            fmt.Println(k, " is an ack containing a message list")
            err = json.Unmarshal(v, &myAck)
            if err != nil {
                fmt.Println("unmarshal error", err)
            } else {
                fmt.Println("New ack object: ", myAck)
            }
        default:
            fmt.Printf("%s is of a type (%T) I don't know how to handle", k, v)
        }
    }
}
Nach dem Login kopieren

Mit diesem Ansatz vermeiden wir den redundanten Schritt des Marshallings und Unmarshallings die JSON-Daten, was den Umgang mit JSON-Daten mit heterogenen Strukturen effizienter und einfacher macht.

Das obige ist der detaillierte Inhalt vonWie kann json.RawMessage beim Umgang mit heterogenen JSON-Strukturen doppeltes Unmarshaling in Go verhindern?. 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