Maison > développement back-end > Golang > Comment décoder et mettre à jour partiellement les données JSON en Go sans perdre les champs inconnus ?

Comment décoder et mettre à jour partiellement les données JSON en Go sans perdre les champs inconnus ?

Patricia Arquette
Libérer: 2024-12-24 20:44:17
original
682 Les gens l'ont consulté

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

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

Lorsque vous travaillez avec des données JSON, il est parfois nécessaire de modifier uniquement des valeurs spécifiques sans perdre la structure existante. Cela peut être difficile si vous ne connaissez pas toute la structure de l'objet JSON, car le package encoding/json de Go tronque les champs non inclus dans la structure cible.

Cet article explore une technique qui exploite une combinaison de structures régulières. et json.RawMessage pour réaliser un décodage et une mise à jour partiels sans perdre d'informations inconnues.

Décodage partiel

La clé Le décodage partiel consiste à conserver l'intégralité des données JSON dans un champ brut (par exemple, map[string]json.RawMessage) et à désassembler sélectivement des champs spécifiques dans votre structure. Voici comment procéder :

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
}
Copier après la connexion

Ici, UnmarshalJSON récupère l'intégralité des données JSON dans c.raw, puis désorganise le champ Space dans c.Space.

Modification des champs connus

Une fois que vous avez partiellement décodé les données JSON, vous pouvez modifier les champs spécifiques comme nécessaire.

Marshaling et préservation

Après avoir modifié vos champs connus, vous devez rassembler la structure Color mise à jour vers JSON. Pour préserver la structure existante et éviter la troncature, vous écrivez votre méthode MarshalJSON personnalisée :

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)
}
Copier après la connexion

Dans MarshalJSON, vous rassemblez le champ Espace modifié, puis l'intégrez à nouveau dans la carte brute avant d'effectuer le regroupement final.

Conclusion

Cette technique vous permet de modifier des valeurs spécifiques dans les données JSON sans perdre d'informations inconnues, ce qui la rend adaptée aux scénarios où la structure JSON complète n'est pas disponible ou est susceptible de changer.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal