Marshaling et Unmarshalling JSON sans débordement de pile
Dans l'encodage JSON, l'appel de json.Unmarshal dans la méthode UnmarshalJSON peut entraîner un débordement de pile. Ce problème survient car le décodeur recherche en permanence une implémentation UnmarshalJSON personnalisée, qui dans ce cas est appelée à plusieurs reprises.
Pour éviter cela, une solution courante consiste à créer un nouveau type à l'aide du mot-clé type. Ce nouveau type sert effectivement de wrapper pour le type d’origine. En convertissant la valeur d'origine vers le nouveau type et en la transmettant à json.Unmarshal, le débordement de pile peut être évité.
Cette approche est efficace car la conversion de type ne modifie pas la représentation des données. Conformément à la spécification Go, les conversions de type non numérique modifient uniquement le type sans altérer la représentation sous-jacente.
Dans l'exemple suivant, un type Personne est défini avec un champ Âge numérique. Une méthode UnmarshalJSON personnalisée garantit que l'âge n'est jamais négatif :
type Person struct { Name string `json:"name"` Age int `json:"age"` } func (p *Person) UnmarshalJSON(data []byte) error { type person2 Person if err := json.Unmarshal(data, (*person2)(p)); err != nil { return err } // Post-processing after unmarshaling if p.Age < 0 { p.Age = 0 } return nil }
Cette technique peut également être appliquée aux méthodes de marshalling personnalisées (MarshalJSON) pour effectuer un prétraitement avant la sérialisation des données.
Rappelez-vous , lors de la définition d'une méthode String() pour une représentation de texte personnalisée, il est essentiel de faire la distinction entre l'utilisation de t et *t pour éviter de modifier par inadvertance la chaîne par défaut. représentation.
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!