JSON Unmarshal of Numeric Values with Exponents
Les utilisateurs de Golang peuvent rencontrer des difficultés lorsqu'ils tentent de désassembler des chaînes JSON dans des structures Go contenant des valeurs numériques avec des exposants . Par défaut, Go interprète mal ces valeurs, ce qui entraîne une perte de précision.
Démonstration du problème
Considérez le code Go suivant :
type Person struct { Id uint64 `json:"id"` Name string `json:"name"` } func parseJSON(jsonStr []byte) { var person Person json.Unmarshal(jsonStr, &person) // The numeric value with an exponent is lost. fmt.Println(person.Id) }
Lorsque nous fournissons une chaîne JSON comme { "id": 1.2E 8, "name": "John" } en entrée, le La fonction parseJSON imprime 0, indiquant que l'exposant est ignoré.
Solution
Pour résoudre ce problème, ajustez le type du champ Id sur un type à virgule flottante tel que float64, comme démontré ci-dessous :
type Person struct { Id float64 `json:"id"` Name string `json:"name"` }
Cette modification permet à Go d'interpréter correctement l'exposant et de conserver le numérique value.
Approche alternative avec des hooks
Dans les cas où la modification du type de champ n'est pas réalisable, vous pouvez utiliser une solution de contournement impliquant un champ "factice" et un hook personnalisé . Ce hook convertirait la valeur du champ « factice » en type entier souhaité.
type Person struct { Id float64 `json:"id"` _Id int64 Name string `json:"name"` } func parseJSONWithHook(jsonStr []byte) { var person Person json.Unmarshal(jsonStr, &person) if reflect.TypeOf(person._Id) == reflect.TypeOf((int64)(0)) { person._Id = int64(person.Id) } }
En suivant l'une ou l'autre approche, vous pouvez gérer avec succès les valeurs numériques avec des exposants dans vos programmes Go.
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!