Heim >Backend-Entwicklung >Golang >Wie kann ich JSON-Objekte in Go teilweise dekodieren und aktualisieren?
Teilweise JSON-Dekodierung und -Aktualisierung in Go
In bestimmten Szenarien tritt ein häufiges Problem auf, wenn nur bestimmte Werte eines JSON-Objekts dekodiert und aktualisiert werden , insbesondere wenn die vollständige Objektstruktur unbekannt ist. Das Standardpaket „Encoding/JSON“ in Go schneidet Felder ab, die nicht in der Struktur enthalten sind, was zu Datenverlust führt.
Lösung mit json.RawMessage
Eine Lösung für dieses Problem ist um eine benutzerdefinierte Struktur mit json.RawMessage zu kombinieren. Dieser Ansatz ermöglicht es uns, die gesamten Daten zur Kodierung/Dekodierung in einem Rohfeld zu speichern.
Der Typ json.RawMessage in Go ist ein []Byte-Wert, der beliebige JSON-Daten enthalten kann. Dies ist in solchen Fällen nützlich, in denen wir nur einen Teil der JSON-Struktur kennen und die unbekannten Teile beibehalten möchten.
Beispielcode
package main import ( "encoding/json" "log" ) type Color struct { Space string raw map[string]json.RawMessage } func (c *Color) UnmarshalJSON(bytes []byte) error { if err := json.Unmarshal(bytes, &c.raw); err != nil { return err } if space, ok := c.raw["Space"]; ok { if err := json.Unmarshal(space, &c.Space); err != nil { return err } } return nil } func (c *Color) MarshalJSON() ([]byte, error) { bytes, err := json.Marshal(c.Space) if err != nil { return nil, err } c.raw["Space"] = json.RawMessage(bytes) return json.Marshal(c.raw) } func main() { before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`) log.Println("before: ", string(before)) // decode color := new(Color) err := json.Unmarshal(before, color) if err != nil { log.Fatal(err) } // modify fields of interest color.Space = "RGB" // encode after, err := json.Marshal(color) if err != nil { log.Fatal(err) } log.Println("after: ", string(after)) }
Ausgabe
before: {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}} after: {"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}
Diese Lösung ermöglicht es uns, nur einen bestimmten Wert (in diesem Fall Leerzeichen) zu dekodieren und zu aktualisieren Beibehaltung aller anderen unbekannten Daten im JSON-Objekt. Es ist wichtig zu beachten, dass bei diesem Ansatz weder die Tastenreihenfolge noch die Einrückungen in der Ausgabe erhalten bleiben.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Objekte in Go teilweise dekodieren und aktualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!