Maison  >  Article  >  développement back-end  >  Numéro JSON tronqué après démarshaling vers l'interface

Numéro JSON tronqué après démarshaling vers l'interface

PHPz
PHPzavant
2024-02-10 09:48:08566parcourir

JSON 数字在解组到接口后被截断

Pendant le processus de développement, nous utilisons souvent le format JSON pour transmettre des données. Cependant, nous constatons parfois qu'après avoir désorganisé les données JSON dans l'interface, les données numériques sont tronquées. C’est une question très courante, mais qui passe facilement inaperçue. Dans cet article, l'éditeur PHP Zimo présentera en détail les causes de ce problème et comment l'éviter et le résoudre pour garantir l'intégrité et l'exactitude des données numériques.

Contenu de la question

J'ai donc un json avec de nombreux champs et je le parcours comme suggéré Comment changer efficacement les clés JSON Supprimez certaines clés dont je n'ai pas besoin. Mais après suppression, les valeurs originales du json existant ont changé, certaines d'entre elles semblaient être des flottants, j'ai fait une démo pour le montrer.

Comment changer ce comportement ? Oui interface{} 导致了该问题吗?为什么1684366653200744506被截断为1684366653200744400 ?

Merci !

https://go.dev/play/p/x2auwqwb2fl

Pour référence, le json de sortie devient 1684366653200744400

2009/11/10 23:00:00 1684366653200744448.000000
2009/11/10 23:00:00 map[timestamp:1.6843666532007444e+18]
2009/11/10 23:00:00 json Marshal from maps of key string and value interface to batch json for insert to DB
2009/11/10 23:00:00 {"timestamp":1684366653200744400}

Solution de contournement

En effet, par défaut, encoding/json 包将 float64 est stocké dans la valeur d'interface d'un numéro json. Voir json.unmarshal :

Pour transformer json en une valeur d'interface, unmarshal stocke l'un des éléments suivants dans la valeur d'interface :

  • bool, pour la valeur booléenne json
  • float64 pour les numéros json
  • ...

Vous pouvez créer un décodeur et appeler (*decoder).usenumber pour modifier le comportement :

jsonBatch := `{"timestamp":1684366653200744506, "todelete":"string value or boolean value"}`
dec := json.NewDecoder(strings.NewReader(jsonBatch))
dec.UseNumber()
var i interface{}
if err := dec.Decode(&i); err != nil {

Voirhttps://www.php.cn/link/3a6c2c9231df58107434b942fa600b22.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer