Heim >Backend-Entwicklung >Golang >Wie kann ich JSON-Daten in Go teilweise dekodieren und aktualisieren, ohne unbekannte Informationen zu verlieren?
Bei der Arbeit mit JSON-Daten ist es oft notwendig, auf bestimmte Werte zuzugreifen und diese zu ändern, ohne die vollständige Struktur des Objekts zu haben . Das Paket „encoding/json“ in Go bietet zwar robuste Dekodier- und Kodierungsfunktionen, schneidet oder ignoriert jedoch Felder, die nicht explizit in der Zielstruktur definiert sind. Dies kann beim erneuten Kodieren zum Verlust unbekannter Informationen führen.
Um diese Herausforderung zu meistern, ist es möglich, eine Kombination aus einer regulären Struktur und JSON zu nutzen. RawMessage ermöglicht eine teilweise Dekodierung und Aktualisierung. json.RawMessage stellt JSON-Rohdaten dar, sodass jede JSON-Struktur gespeichert werden kann, ohne dass ihre spezifische Form dekodiert werden muss.
Im folgenden Codeausschnitt wird die Color-Struktur mit einem Space-Feld und einem Rohfeld vom Typ Map definiert[ string]json.RawMessage. Dies ermöglicht die Speicherung des gesamten JSON-Objekts, während explizit nur das bekannte Feld (Space) entmarshallt wird.
type Color struct { Space string raw map[string]json.RawMessage }
Während des Unmarshaling-Vorgangs extrahiert die UnmarshalJSON-Methode das Space-Feld aus den Rohdaten, sofern vorhanden. Die kompletten Rohdaten werden in der Rohkarte gespeichert.
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 }
Beim Aktualisieren von Werten müssen nur die bekannten Felder geändert werden. In diesem Fall kann color.Space ein neuer Wert zugewiesen werden.
Während des Marshallings ruft die MarshalJSON-Methode den aktualisierten Space-Wert ab und speichert ihn zuvor als json.RawMessage in der Rohkarte Codierung des gesamten Objekts als JSON.
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) }
Das folgende Beispiel demonstriert die teilweise Dekodierung und Aktualisierung eines JSON-Objekts:
before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`) // Decode color := new(Color) err := json.Unmarshal(before, color) // Modify the Space field color.Space = "RGB" // Encode after, err := json.Marshal(color)
Die Ausgabe wäre:
{"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}
Dieser Ansatz bewahrt die unbekannte Struktur und Informationen und ermöglicht eine teilweise Dekodierung und Aktualisierung von JSON-Objekte.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Daten in Go teilweise dekodieren und aktualisieren, ohne unbekannte Informationen zu verlieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!