这篇文章主要给大家介绍了关于 golang 中 json 反序列化可能遇到的问题的解决方法, 文中通过示例代码介绍的非常详细, 对大家学习或者工作具有一定的参考学习价值, 需要的朋友们下面随着小编来一起学习学习吧
前言
在 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]
来源: http://www.phperz.com/article/18/0226/362564.html