La fosse du json de golang.Unmarshal

Prenez l'habitude d'écrire ensemble ! C'est le 5ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .

Récemment, dans le développement de l'entreprise Golang, j'ai rencontré une fosse.

Nous avons un service qui prend un objet d'interface générique et envoie un message à l'utilisateur. Par conséquent, il s'agira de convertir les chaînes transmises par diverses parties commerciales en objets d'interface.

Cependant, parce qu'il y a un nombre dans ma chaîne, comme celui de la démo ci-dessous {"number":1234567}, et que le nombre est de 7 chiffres, json.Unmarshalil est converti sous forme de notation scientifique après passage, ce qui entraîne un lien anormal envoyé par message privé, et le résultat est une erreur.

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   jsonStr := `{"number":1234567}`
   result := make(map[string]interface{})
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(result) // map[number:1.234567e+06]

}
复制代码

Lorsque la structure de données est inconnue et est utilisée  map[string]interface{} pour recevoir des résultats de désérialisation, si le nombre de chiffres est supérieur à 6, elle deviendra une notation scientifique et les endroits où elle est utilisée seront affectés.

Dans le encoding/jsonpackage, vous pouvez trouver le commentaire suivant :

//
// To unmarshal JSON into an interface value,
// Unmarshal stores one of these in the interface value:
//
// bool, for JSON booleans
// float64, for JSON numbers
// string, for JSON strings
// []interface{}, for JSON arrays
// map[string]interface{}, for JSON objects
// nil for JSON null
//
复制代码

Pour les nombres, qui sont analysés en  float64 types, il peut y avoir une forme de notation scientifique.

Solution au problème 1 : Casting

func main() {
   jsonStr := `{"number":1234567}`
   result := make(map[string]interface{})
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(int(result["number"].(float64)))

   // 输出
   // 1234567
}
复制代码

Solution au problème 2 : essayez d'éviter de l'utiliser  interfacejson définissez une structure pour la structure de chaîne

func main() {
   type Num struct {
      Number int `json:"number"`
   }

   jsonStr := `{"number":1234567}`
   var result Num
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(result)

   // 输出
   // {1234567}
}
复制代码

Documents de référence : www.cnblogs.com/xinliangcod…

Je suppose que tu aimes

Origine juejin.im/post/7086489526847143967
conseillé
Classement