Erreur de démarshal Golang JSON : les valeurs numériques avec exposants renvoient 0
Lors de la tentative de démarshalage des données JSON dans une structure Go, les utilisateurs ont rencontré un problème où les valeurs numériques avec exposants sont systématiquement interprétées comme 0. Ce comportement provient d'une inadéquation entre le type attendu et la valeur réelle.
Par exemple, si une chaîne JSON comme {"id": 1.2e 8 , "Name": "Fernando"} doit être désorganisé dans une structure avec un champ Id de type uint64, l'ID résultant sera 0.
Solution
Pour résoudre ce problème, assurez-vous que le type du champ dans la structure correspond au type des données dans la chaîne JSON. Dans ce cas, puisque des exposants sont utilisés, le champ Id doit être défini comme un type à virgule flottante comme float32 ou float64.
Solution alternative
Pour les situations où le Le type attendu n'est pas compatible avec le format numérique JSON, une solution de contournement peut être implémentée. En ajoutant un champ « factice » du type souhaité, un hook peut être utilisé pour convertir la valeur en type réel attendu.
Par exemple :
type Person struct { Id float64 `json:"id"` _Id int64 Name string `json:"name"` }
Après avoir désorganisé les données JSON dans la structure Person, une vérification conditionnelle peut être ajoutée pour convertir le champ Id en int64.
var f Person var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`) _ = json.Unmarshal(b, &f) if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) { fmt.Println(f.Id) f._Id = int64(f.Id) }
Cette approche hacky permet la conversion du champ Id à virgule flottante vers le type int64 souhaité.
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!