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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-12-24 20:44:17698Durchsuche

How to Partially Decode and Update JSON Data in Go Without Losing Unknown Fields?

Teilweise Dekodierung und Aktualisierung von JSON in Go

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.

Partielle Dekodierung

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.

Bekannte Felder ändern

Sobald Sie die JSON-Daten teilweise dekodiert haben, können Sie die spezifischen Felder wie folgt ändern benötigt.

Marshaling und Beibehaltung

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.

Fazit

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!

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