问题
最近在项目中遇到一个坑,Go语言在json反序列化时,如果未指定类型,则数字(比如int64)会默认是 float64,这样再次序列化的时候造成了精度丢失。
具体可以看如下代码
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
func main() {
s := "{\"a\":6673221165400540161}"
d := make(map[string]interface{})
err := jsoniter.Unmarshal([]byte(s), &d)
if err != nil {
panic(err)
}
s2, err := jsoniter.Marshal(d)
if err != nil {
panic(err)
}
fmt.Println(string(s2))
}
代码执行结果是:
{“a”:6673221165400540000}
原始数据是:
{“a”:6673221165400540161}
产生了精度丢失。
解决办法
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
"strings"
)
func main() {
s := "{\"a\":6673221165400540161}"
decoder := jsoniter