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.
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 }
Ici, UnmarshalJSON récupère l'intégralité des données JSON dans c.raw, puis désorganise le champ Space dans c.Space.
Une fois que vous avez partiellement décodé les données JSON, vous pouvez modifier les champs spécifiques comme nécessaire.
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) }
Dans MarshalJSON, vous rassemblez le champ Espace modifié, puis l'intégrez à nouveau dans la carte brute avant d'effectuer le regroupement final.
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!