当前位置: 移动技术网 > IT编程>脚本编程>Go语言 > golang中json反序列化可能遇到的问题

golang中json反序列化可能遇到的问题

2018年01月25日  | 移动技术网IT编程  | 我要评论

前言

在golang中,当浮点数超过一定数值的时候,golang会把它弄成科学计数法的形式进行显示(好像只要大于七位数就变成科学计数法了)

var val float64
val = 1000000
fmt.println(val) // ==> 1e+06

而在日常开发中,我们经常遇到这样一个问题,就是要反序列化前端传递来的json,因为数据结构未知,所以我们便会使用map[string]interface{}来接收反序列化的结果。由于golang将json解析到interface{}类型的时候,遵循如下规则

  • bool 代表 json booleans,
  • float64 代表 json numbers,
  • string 代表 json strings,
  • nil 代表 json null.

所以如果我们接收到的json中存在一个比较大的数字,那么它就会被解析成float64类型的,并且有可能显示为科学计数法的形式,比如下面这个例子

package main
import (
 "encoding/json"
 "fmt"
)

func main() {
 //create the json string
 var data = `
 {
 "id": 12423434, 
 "name": "fernando"
 }
 `

 //marshal the json to a map
 var result map[string]interface{}
 err := json.unmarshal([]byte(data), &result)
 if err != nil {
 fmt.println(err.error())
 return
 }
 fmt.println(result)
}

输出如下结果

map[id:1.2423434e+07 name:fernando]

这个时候如果把它传递给前端使用的话,那么前端是有可能会报错的。所以我们最好还是保持这个数字的原始字符串表现形式。即使用json.number类型来表示

所以换成如下代码就可以了

package main
import (
 "encoding/json"
 "fmt"
 "strings"
)

func main() {
 //create the json string
 var data = `
 {
 "id": 12423434, 
 "name": "fernando"
 }
 `
 //marshal the json to a map
 var result map[string]interface{}
 d := json.newdecoder(strings.newreader(data))
 d.usenumber()
 err := d.decode(&result)
 if err != nil {
 fmt.println(err.error())
 return
 }
 // 此刻result["id"]的类型就是json.number了 它的底层类型其实就是string
 fmt.println(result)
}

输出如下结果

map[id:12423434 name:fernando]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网