Décodage partiel et mise à jour de JSON dans Go
Lorsque vous travaillez avec des objets JSON, il peut être nécessaire de décoder uniquement des valeurs spécifiques tout en préservant les valeurs inconnues parties de l'objet. Le package encoding/json dans Go a cependant tendance à tronquer les champs non présents dans la structure, entraînant une perte de données lors du réencodage.
Une solution
Pour pour surmonter ce problème, une combinaison d'une structure simple et de json.RawMessage peut être utilisée pour préserver les champs inconnus.
type Color struct { Space string raw map[string]json.RawMessage }
Dans cette structure, le champ brut stocke l'intégralité de l'objet JSON sous forme de RawMessage. Lors du décodage, la méthode UnmarshalJSON lit le champ brut pour extraire des valeurs spécifiques dans les champs définis de la structure.
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 }
De même, lors de l'encodage, la méthode MarshalJSON sérialise le champ Espace et met à jour la carte brute avec les octets codés. .
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) }
Cette approche permet un décodage partiel et une mise à jour de champs spécifiques, tout en préservant les parties inconnues du Objet 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!