版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meifannao789456/article/details/88067210
数据由map[string]int64 变成map[string]interface{}时, 数据会发生变化
json 在处理go的数据类型转换时,有个对应关系:
数据类型 | JSON | Golang |
---|---|---|
字符串 | string | string |
整数 | number | int64 |
浮点数 | number | flaot64 |
数组 | arrary | slice |
对象 | object | struct |
布尔 | bool | bool |
空值 | null | nil |
在将数字类型unmarshal 转化为interface{} 的时候,默认会先使用浮点数转换,这样,可能会丢失精度。那如何处理?反序列化的时候,将数据类型转换为json.Number 就ok,这样数据会延迟转换,后面可以根据需要转换为int64 或者是 float ,也可以是string。
给个正确的例子,应该使用UseNumber 反序列化:
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type Account struct {
Email string `json:"email"`
Password string `json:"password"`
Money int64 `json:"money"`
}
func main() {
account := Account{
Email: "[email protected]",
Password: "123",
Money: int64(72057594088097496),
}
deal(account)
}
func deal(data interface{}) {
bdata, err := json.Marshal(data)
fmt.Printf("err %v, str %+v\n", err, string(bdata))
var val map[string]interface{}
d := json.NewDecoder(bytes.NewBuffer(bdata))
d.UseNumber()
err = d.Decode(&val)
fmt.Printf("err %v, str %+v\n", err, val)
}