Heim >Backend-Entwicklung >Golang >Wie kann ich JSON-Daten in Go teilweise dekodieren und aktualisieren, ohne unbekannte Informationen zu verlieren?

Wie kann ich JSON-Daten in Go teilweise dekodieren und aktualisieren, ohne unbekannte Informationen zu verlieren?

Susan Sarandon
Susan SarandonOriginal
2024-12-24 13:02:19884Durchsuche

How Can I Partially Decode and Update JSON Data in Go Without Losing Unknown Information?

Teilweise Dekodierung und Aktualisierung von JSON in Go

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.

Lösung: Einsatz von json.RawMessage

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
}

Unmarshaling und Aktualisierung

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.

Marshaling

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

Beispielverwendung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn