Lors de l'analyse de JSON dans Go, les entiers supérieurs à 32 bits peuvent être automatiquement convertis en valeurs float64 par le décodeur JSON par défaut. Cela pose un défi lorsque vous devez préserver l'exactitude de tels entiers.
Une solution à ce problème consiste à utiliser un décodeur personnalisé et à employer la méthode UseNumber. Cela vous permet de décoder des nombres en un type json.Number, qui peut facilement être reconverti en entier.
package main import ( "bytes" "encoding/json" "fmt" "strconv" ) func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") dat := make(map[string]interface{}) d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() if err := d.Decode(&dat); err != nil { panic(err) } tags := dat["tags"].([]interface{}) n := tags[0].(map[string]interface{})["id"].(json.Number) i64, _ := strconv.ParseUint(string(n), 10, 64) fmt.Println(i64) // prints 4418489049307132905 }
Vous pouvez également concevoir une structure de données personnalisée pour correspondre à votre schéma JSON, qui peut gérer entiers de n'importe quelle taille.
package main import "encoding/json" import "fmt" type A struct { Tags []map[string]uint64 // "tags" } func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") var a A if err := json.Unmarshal(body, &a); err != nil { panic(err) } fmt.Println(a.Tags[0]["id"]) // logs 4418489049307132905 }
Gardez à l'esprit que si votre application communique avec JavaScript, qui n'a pas de véritable 64 bits entiers, vous risquez de perdre des données lors du marshalling et du démarshalling.
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!