Heim >Backend-Entwicklung >Golang >Wie kann ich JSON-Objekte in Go teilweise dekodieren und aktualisieren?

Wie kann ich JSON-Objekte in Go teilweise dekodieren und aktualisieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-25 00:29:16855Durchsuche

How to Partially Decode and Update JSON Objects in Go?

Teilweise JSON-Dekodierung und -Aktualisierung in Go

In bestimmten Szenarien tritt ein häufiges Problem auf, wenn nur bestimmte Werte eines JSON-Objekts dekodiert und aktualisiert werden , insbesondere wenn die vollständige Objektstruktur unbekannt ist. Das Standardpaket „Encoding/JSON“ in Go schneidet Felder ab, die nicht in der Struktur enthalten sind, was zu Datenverlust führt.

Lösung mit json.RawMessage

Eine Lösung für dieses Problem ist um eine benutzerdefinierte Struktur mit json.RawMessage zu kombinieren. Dieser Ansatz ermöglicht es uns, die gesamten Daten zur Kodierung/Dekodierung in einem Rohfeld zu speichern.

Der Typ json.RawMessage in Go ist ein []Byte-Wert, der beliebige JSON-Daten enthalten kann. Dies ist in solchen Fällen nützlich, in denen wir nur einen Teil der JSON-Struktur kennen und die unbekannten Teile beibehalten möchten.

Beispielcode

package main

import (
    "encoding/json"
    "log"
)

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
}

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

func main() {
    before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`)
    log.Println("before: ", string(before))

    // decode
    color := new(Color)
    err := json.Unmarshal(before, color)
    if err != nil {
        log.Fatal(err)
    }

    // modify fields of interest
    color.Space = "RGB"

    // encode
    after, err := json.Marshal(color)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("after:  ", string(after))
}

Ausgabe

before:  {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}
after:   {"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}

Diese Lösung ermöglicht es uns, nur einen bestimmten Wert (in diesem Fall Leerzeichen) zu dekodieren und zu aktualisieren Beibehaltung aller anderen unbekannten Daten im JSON-Objekt. Es ist wichtig zu beachten, dass bei diesem Ansatz weder die Tastenreihenfolge noch die Einrückungen in der Ausgabe erhalten bleiben.

Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Objekte in Go teilweise dekodieren und aktualisieren?. 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