Maison >développement back-end >Golang >Comment puis-je décoder et mettre à jour partiellement les données JSON dans Go sans perdre d'informations inconnues ?

Comment puis-je décoder et mettre à jour partiellement les données JSON dans Go sans perdre d'informations inconnues ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-24 13:02:19838parcourir

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

Décodage partiel et mise à jour de JSON dans Go

Lorsque vous travaillez avec des données JSON, il est souvent nécessaire d'accéder et de modifier des valeurs spécifiques sans avoir la structure complète de l'objet . Le package encoding/json dans Go, tout en fournissant des capacités de décodage et d'encodage robustes, tronque ou ignore les champs non explicitement définis dans la structure de destination. Cela peut entraîner la perte d'informations inconnues lors du réencodage.

Solution : utiliser json.RawMessage

Pour surmonter ce défi, il est possible d'exploiter une combinaison d'une structure régulière et de json. RawMessage pour réaliser un décodage et une mise à jour partiels. json.RawMessage représente des données JSON brutes, permettant de conserver n'importe quelle structure JSON sans décoder sa forme spécifique.

Dans l'extrait de code suivant, la structure Color est définie avec un champ Espace et un champ brut de type map[ chaîne]json.RawMessage. Cela permet le stockage de l'intégralité de l'objet JSON tout en désorganisant explicitement uniquement le champ connu (Espace).

type Color struct {
    Space string
    raw   map[string]json.RawMessage
}

Désagrégation et mise à jour

Pendant le processus de désorganisation, la méthode UnmarshalJSON extrait le champ Espace. à partir des données brutes, si elles sont présentes. Les données brutes complètes sont stockées dans la carte brute.

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
}

Lors de la mise à jour des valeurs, seuls les champs connus doivent être modifiés. Dans ce cas, color.Space peut se voir attribuer une nouvelle valeur.

Marshaling

Pendant le marshaling, la méthode MarshalJSON récupère la valeur d'espace mise à jour et la stocke sous json.RawMessage dans la carte brute avant encodant l'objet entier au format 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)
}

Exemple d'utilisation

L'exemple suivant démontre le décodage et la mise à jour partiels d'un objet JSON :

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)

Le résultat serait :

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

Cette approche préserve la structure et les informations inconnues, permettant un décodage et une mise à jour partiels de Objets JSON.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn