golang中json反序列化可能遇到的问题
前言
在golang中,当浮点数超过一定数值的时候,golang会把它弄成科学计数法的形式进行显示(好像只要大于七位数就变成科学计数法了)
varvalfloat64 val=1000000 fmt.Println(val)//==>1e+06
而在日常开发中,我们经常遇到这样一个问题,就是要反序列化前端传递来的json,因为数据结构未知,所以我们便会使用map[string]interface{}来接收反序列化的结果。由于golang将json解析到interface{}类型的时候,遵循如下规则
- bool代表JSONbooleans,
- float64代表JSONnumbers,
- string代表JSONstrings,
- nil代表JSONnull.
所以如果我们接收到的json中存在一个比较大的数字,那么它就会被解析成float64类型的,并且有可能显示为科学计数法的形式,比如下面这个例子
packagemain import( "encoding/json" "fmt" ) funcmain(){ //CreatetheJsonstring vardata=` { "id":12423434, "Name":"Fernando" } ` //Marshalthejsontoamap varresultmap[string]interface{} err:=json.Unmarshal([]byte(data),&result) iferr!=nil{ fmt.Println(err.Error()) return } fmt.Println(result) }
输出如下结果
map[id:1.2423434e+07Name:Fernando]
这个时候如果把它传递给前端使用的话,那么前端是有可能会报错的。所以我们最好还是保持这个数字的原始字符串表现形式。即使用json.Number类型来表示
所以换成如下代码就可以了
packagemain import( "encoding/json" "fmt" "strings" ) funcmain(){ //CreatetheJsonstring vardata=` { "id":12423434, "Name":"Fernando" } ` //Marshalthejsontoamap varresultmap[string]interface{} d:=json.NewDecoder(strings.NewReader(data)) d.UseNumber() err:=d.Decode(&result) iferr!=nil{ fmt.Println(err.Error()) return } //此刻result["id"]的类型就是json.Number了它的底层类型其实就是string fmt.Println(result) }
输出如下结果
map[id:12423434Name:Fernando]
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。