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 résoudre 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3