Teilweise Dekodierung und Aktualisierung von JSON in Go
Bei der Arbeit mit JSON-Objekten kann es erforderlich sein, nur bestimmte Werte zu dekodieren und unbekannte Werte beizubehalten Teile des Objekts. Das Paket „encoding/json“ in Go tendiert jedoch dazu, Felder abzuschneiden, die nicht in der Struktur vorhanden sind, was bei der Neucodierung zu Datenverlust führt.
Eine Lösung
Zu Um dieses Problem zu lösen, kann eine Kombination aus einer einfachen Struktur und json.RawMessage verwendet werden, um unbekannte Felder beizubehalten.
type Color struct { Space string raw map[string]json.RawMessage }
Hier struct speichert das Rohfeld das gesamte JSON-Objekt als RawMessage. Beim Dekodieren liest die UnmarshalJSON-Methode das Rohfeld, um bestimmte Werte in die definierten Felder der Struktur zu extrahieren.
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 }
Ähnlich serialisiert die MarshalJSON-Methode beim Kodieren das Space-Feld und aktualisiert die Rohkarte mit den kodierten Bytes .
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) }
Dieser Ansatz ermöglicht die teilweise Dekodierung und Aktualisierung bestimmter Felder, während die unbekannten Teile davon erhalten bleiben JSON-Objekt.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON in Go teilweise dekodieren und aktualisieren und dabei unbekannte Felder beibehalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!