Dérivation de types personnalisés pour le démarshaling JSON dans Go
Lorsque vous travaillez avec des types personnalisés dans Go, il est souvent nécessaire d'implémenter la fonction UnmarshalJSON pour activer conversion automatique de JSON vers le type souhaité. Cependant, des défis surviennent lorsque le type est dérivé d’une valeur scalaire. Cet article explore une solution pour surmonter ce problème.
Prenons l'exemple d'un type PersonID qui représente des constantes entières sous-typées pour identifier les individus. Nous souhaitons étendre les fonctionnalités de ce type pour prendre en charge la conversion automatique à partir de chaînes JSON. L'implémentation d'UnmarshalJSON pour ce type devient difficile car il est destiné à renvoyer ou modifier directement une valeur scalaire, alors qu'UnmarshalJSON attend une structure pour sa modification.
Pour résoudre ce problème, nous adoptons une approche de récepteur de pointeur. En utilisant un récepteur de pointeur, les modifications apportées dans la méthode UnmarshalJSON sont reflétées sur la valeur d'origine. Voici un exemple de l'implémentation modifiée d'UnmarshalJSON :
func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil }
Dans cette implémentation, le texte JSON n'est pas marshalé en une variable de chaîne avant d'être transmis à la fonction Lookup, qui convertit la chaîne en la valeur PersonID souhaitée. Cette valeur est ensuite attribuée au pointeur intValue.
De plus, pour éviter les conflits entre les balises JSON et les données JSON, assurez-vous que les balises de la structure MyType correspondent aux noms de champs dans le JSON. En suivant ces étapes, vous pouvez implémenter avec succès UnmarshalJSON pour les types scalaires dérivés.
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!