Golang Json Unmarshal Numeric with Exponent
Lors de la désagrégation de chaînes JSON en structures contenant des valeurs numériques avec des exposants, vous pouvez rencontrer des cas où l'exposant est systématiquement tronqué à 0. Ce problème peut survenir lorsque le type de votre champ de structure ne correspond pas au type de données dans le JSON.
Dans l'exemple fourni, le champ Id de la structure Person est défini comme uint64, qui représente des entiers 64 bits non signés. Cependant, la valeur de la chaîne JSON est un nombre décimal en notation scientifique (1.2E 8).
Étant donné que Go ne peut pas convertir automatiquement un nombre décimal avec un exposant en un entier non signé de 64 bits, le résultat est tronqué à 0.
Comment résoudre le problème
Pour Pour résoudre ce problème, vous pouvez modifier le type du champ Id pour qu'il corresponde au type de données dans la chaîne JSON. Dans ce cas, puisque le nombre est décimal, vous pouvez utiliser float32 ou float64 :
type Person struct { Id float32 `json:"id"` Name string `json:"name"` }
En mettant à jour le type en float32 ou float64, Go peut désormais interpréter correctement la valeur numérique avec un exposant et lui attribuer au champ Id de la structure Person.
Alternativement, si vous souhaitez conserver le type entier d'origine pour Id, vous pouvez utiliser un personnalisé Hook de démarshalisation JSON. Ce hook peut convertir la valeur à virgule flottante en entier avant de l'attribuer au champ :
type Person struct { Id int64 `json:"id"` Name string `json:"name"` } func (p *Person) UnmarshalJSON(b []byte) error { type Alias Person var a Alias if err := json.Unmarshal(b, &a); err != nil { return err } // Convert the float64 Id to int64 p.Id = int64(a.Id) return nil }
Avec le unmarshaler personnalisé, la valeur numérique avec un exposant dans la chaîne JSON sera correctement convertie et attribuée à le champ Id de la structure Person.
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!