Conserver les valeurs entières de 64 bits lors de l'analyse JSON dans Go
Dans Go, l'analyse des données JSON contenant des valeurs entières de 64 bits peut entraîner leur conversion en valeurs float64, entraînant une perte de précision. Cet article résout ce problème en présentant deux solutions pour conserver les valeurs entières d'origine lors de l'analyse JSON.
Solution 1 : Utiliser Decoder et UseNumber
En utilisant le UseNumber du type Decoder méthode, on peut demander au décodeur de traiter les valeurs numériques comme des objets json.Number au lieu de valeurs float64. json.Number peut être facilement converti en un type uint64 ou int64 à l'aide respectivement des fonctions ParseUint ou ParseInt.
Exemple :
import ( "encoding/json" "bytes" "fmt" "strconv" ) body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`) d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() var dat map[string]interface{} err := d.Decode(&dat) tags := dat["tags"].([]interface{}) value := tags[0].(map[string]interface{})["id"].(json.Number) id, _ := strconv.ParseUint(string(value), 10, 64) fmt.Println(id) // Prints 4418489049307132905
Solution 2 : Décodage en une structure personnalisée
Définition d'une structure personnalisée qui correspond à la structure des données JSON permet l'attribution directe de valeurs entières aux champs entiers. Cela élimine le besoin de conversion ou de manipulation ultérieure des données.
Exemple :
import ( "encoding/json" "fmt" ) type Tag struct { Id uint64 `json:"id"` } type Data struct { Tags []Tag `json:"tags"` } body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`) var data Data json.Unmarshal(body, &data) fmt.Println(data.Tags[0].Id) // Logs 4418489049307132905
Attention :
Si les données JSON proviennent d'une source qui utilise JavaScript, il convient de noter que JavaScript ne prend en charge que les valeurs flottantes double précision IEEE754 et n'a pas de valeur true. Entiers de 64 bits. Cela signifie que l'analyse de ces données JSON en JavaScript entraînera une perte de précision, quelle que soit la méthode utilisée dans 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!