Heim > Backend-Entwicklung > Golang > Wie vermeide ich doppeltes Unmarshaling beim Parsen von JSON in Go?

Wie vermeide ich doppeltes Unmarshaling beim Parsen von JSON in Go?

Mary-Kate Olsen
Freigeben: 2024-12-30 07:07:09
Original
1022 Leute haben es durchsucht

How to Avoid Double Unmarshaling When Parsing JSON in Go?

Unmarshaling von JSON in Go ohne doppeltes Unmarshaling

In Go kann es vorkommen, dass Sie JSON in verschiedene Strukturen analysieren müssen, es kommt jedoch zu doppeltem Unmarshalling, was zu Redundanz führt. In diesem Artikel wird eine Lösung vorgestellt, die ein teilweises Unmarshaling der Daten beinhaltet, um den zweiten Unmarshaling-Schritt zu vermeiden.

Verstehen des Problems

Beim Versuch, JSON in bekannte Strukturen zu analysieren, tritt ein häufiges Problem auf Der Ansatz ist:

  1. JSON in ein generisches Unmarshalieren map[string]interface{}
  2. Erwarteten Schlüssel finden
  3. Versuchen Sie, den Wert in den gewünschten Typ umzuwandeln
  4. Wenn die Umwandlung fehlschlägt, Marshallen Sie den Wert als JSON und entmarshalieren Sie ihn zum gewünschten Typ (doppeltes Unmarshalling)

Die Lösung

Anstatt den Wert in eine Schnittstelle{} umzuwandeln, kann man ihn in eine json.RawMessage entpacken. Dadurch werden die Daten teilweise entmarshallt und ein anschließendes Unmarshalling für bestimmte Strukturen basierend auf dem Schlüsselwert ermöglicht.

Beispielcode

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

    jsonAck, ok := myMap["ack"]
    if !ok {
        fmt.Println("key 'ack' not found")
        return
    }

    err = json.Unmarshal(jsonAck, &myAck)
    if err != nil {
        fmt.Println("unmarshal error", err)
    } else {
        fmt.Println("New ack object: ", myAck)
    }
}
Nach dem Login kopieren

In diesem geänderten Code ersetzen wir die Karte [string]interface{} mit map[string]json.RawMessage. Bei der Handhabung der „ack“-Taste erfolgt das Unmarshalling direkt zur Ack-Struktur, sodass kein doppeltes Unmarshalling erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie vermeide ich doppeltes Unmarshaling beim Parsen von JSON in Go?. 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