欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-05 11:58:43
前言 在golang中,当浮点数超过一定数值的时候,golang会把它弄成科学计数法的形式进行显示(好像只要大于七位数就变成科学计数法了) var val fl...

前言

在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]

总结

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