golang中json反序列化可能遇到的问题
作者:youyu岁月 时间:2024-04-27 15:36:12
前言
在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.itzh.org/2017/12/27/golang_json_unmarshal_problem/
标签:golang,json,反序列化
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
使用python解析xml成对应的html示例分享
2022-05-05 21:02:27
Python3实现从文件中读取指定行的方法
2021-01-06 04:18:17
常用ASCII 码对照表
2007-08-21 14:35:00
Flask使用Pyecharts在单个页面展示多个图表的方法
2021-10-12 18:16:35
![](https://img.aspxhome.com/file/2023/4/82694_0s.jpg)
图解Golang的GC垃圾回收算法
2023-07-12 23:25:45
![](https://img.aspxhome.com/file/2023/9/93659_0s.png)
如何使用Python异步之上下文管理器
2023-07-09 08:47:51
Mysql升级到5.7后遇到的group by查询问题解决
2024-01-16 12:17:50
vue地区选择组件教程详解
2023-07-02 16:49:48
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2023-10-31 02:27:35
Python中encode()方法的使用简介
2023-09-22 15:26:38
解决pycharm回车之后不能换行或不能缩进的问题
2023-06-11 10:45:40
![](https://img.aspxhome.com/file/2023/2/75962_0s.jpg)
vue项目中如何引入cesium
2024-05-28 15:52:29
![](https://img.aspxhome.com/file/2023/3/123153_0s.png)
Python&Matlab实现伏羲八卦图的绘制
2023-02-01 02:42:39
![](https://img.aspxhome.com/file/2023/5/121635_0s.gif)
Rs.Open参数说明
2008-05-12 22:43:00
python Jupyter运行时间实例过程解析
2022-04-15 04:38:21
Python实现猜拳与猜数字游戏的方法详解
2022-06-17 18:32:25
![](https://img.aspxhome.com/file/2023/7/101257_0s.jpg)
python 决策树算法的实现
2022-10-15 05:49:56
GOLANG版的冒泡排序和快速排序分享
2023-07-05 05:31:09
python逆向微信指数爬取实现步骤
2022-03-31 03:36:48
![](https://img.aspxhome.com/file/2023/2/81602_0s.jpg)
jupyter notebook参数化运行python方式
2022-09-10 21:38:55
![](https://img.aspxhome.com/file/2023/1/70111_0s.jpg)