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