Bei der Arbeit mit JSON-Daten ist es manchmal notwendig, nur bestimmte Werte zu ändern, ohne die bestehende Struktur zu verlieren. Dies kann eine Herausforderung sein, wenn Sie nicht die gesamte Struktur des JSON-Objekts kennen, da das Paket „encoding/json“ von Go Felder abschneidet, die nicht in der Zielstruktur enthalten sind.
In diesem Artikel wird eine Technik untersucht, die eine Kombination aus regulären Strukturen nutzt und json.RawMessage, um eine teilweise Dekodierung und Aktualisierung zu erreichen, ohne unbekannte Informationen zu verlieren.
Der Schlüssel zur teilweisen Dekodierung Bei der Dekodierung werden die gesamten JSON-Daten in einem Rohfeld (z. B. „map[string]json.RawMessage“) gespeichert und bestimmte Felder selektiv in Ihre Struktur entmarshaliert. So wird es gemacht:
import "encoding/json" 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 }
Hier ruft UnmarshalJSON die gesamten JSON-Daten in c.raw ab und entmarshmiert dann das Space-Feld in c.Space.
Sobald Sie die JSON-Daten teilweise dekodiert haben, können Sie die spezifischen Felder wie folgt ändern benötigt.
Nachdem Sie Ihre bekannten Felder geändert haben, müssen Sie die aktualisierte Farbstruktur zurück in JSON marshallen. Um die vorhandene Struktur beizubehalten und Kürzungen zu vermeiden, schreiben Sie Ihre benutzerdefinierte MarshalJSON-Methode:
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) }
In MarshalJSON Marshallen Sie das geänderte Space-Feld und betten es dann wieder in die Rohkarte ein, bevor Sie das endgültige Marshalling durchführen.
Mit dieser Technik können Sie bestimmte Werte in JSON-Daten ändern, ohne unbekannte Informationen zu verlieren, wodurch sie für Szenarien geeignet ist, in denen die Die vollständige JSON-Struktur ist nicht verfügbar oder kann geändert werden.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Daten in Go teilweise dekodieren und aktualisieren, ohne unbekannte Felder zu verlieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!