Lors du traitement des requêtes JSON POST contenant des tableaux d'objets avec des valeurs int64, il est courant de rencontrer des problèmes de conversion. JSON.Unmarshal convertit automatiquement ces valeurs en float64, ce qui peut être gênant. Cet article explore des solutions pour préserver les valeurs int64 d'origine.
Solution 1 : Utilisation du type numérique
Le type json.Decoder inclut une méthode UseNumber qui vous permet de décoder les nombres dans un type personnalisé. En définissant un type Number qui représente un littéral numérique JSON, vous pouvez le reconvertir facilement en int64 :
func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") var dat map[string]interface{} d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() if err := d.Decode(&dat); err != nil { panic(err) } // ... n := tags[0].(map[string]interface{})["id"].(json.Number) i64, _ := strconv.ParseUint(string(n), 10, 64) }
Solution 2 : décodage en structure personnalisée
Vous peut également décoder directement dans une structure spécifique adaptée à votre data :
type A struct { Tags []map[string]uint64 } func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") var a A if err := json.Unmarshal(body, &a); err != nil { panic(err) } // ... println(a.Tags[0]["id"]) }
Attention :
Notez que si votre application interagit avec JavaScript, qui ne prend en charge que les flottants double précision IEEE754, vous pouvez rencontrer des problèmes d'analyse avec les valeurs int64 .
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!