Implémentation d'UnmarshalJSON pour les scalaires dérivés dans Go
Problème :
Un type personnalisé qui convertit les constantes entières sous-typées aux chaînes et vice versa nécessite une suppression automatique des chaînes JSON. C'est un défi car UnmarshalJSON ne fournit pas de moyen de modifier la valeur scalaire sans utiliser de structure.
Solution :
Pour implémenter UnmarshalJSON pour un type scalaire dérivé, envisagez les étapes suivantes :
Utilisez un récepteur pointeur :
Utilisez un récepteur de pointeur pour la méthode UnmarshalJSON pour modifier la valeur du récepteur.
Annuler le marshal en une chaîne :
Annuler le texte JSON dans une chaîne simple, en supprimant toutes les citations JSON.
Rechercher et définir la valeur :
Utilisez la fonction de recherche pour récupérer le PersonID correspondant en fonction de la valeur de la chaîne. Attribuez le résultat au récepteur.
Exemple :
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 }
Exemple de code :
package main import ( "encoding/json" "fmt" ) type PersonID int const ( Bob PersonID = iota Jane Ralph Nobody = -1 ) var nameMap = map[string]PersonID{ "Bob": Bob, "Jane": Jane, "Ralph": Ralph, "Nobody": Nobody, } var idMap = map[PersonID]string{ Bob: "Bob", Jane: "Jane", Ralph: "Ralph", Nobody: "Nobody", } func (intValue PersonID) Name() string { return idMap[intValue] } func Lookup(name string) PersonID { return nameMap[name] } 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 } type MyType struct { Person PersonID `json: "person"` Count int `json: "count"` Greeting string `json: "greeting"` } func main() { var m MyType if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil { fmt.Println(err) } else { for i := 0; i < m.Count; i++ { fmt.Println(m.Greeting, m.Person.Name()) } } }
Sortie :
Hello Ralph Hello Ralph Hello Ralph Hello Ralph
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!