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.Unmarshal
il 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/json
package, 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 interface
, json
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…