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,反序列化
0
投稿

猜你喜欢

  • 使用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
  • 图解Golang的GC垃圾回收算法

    2023-07-12 23:25:45
  • 如何使用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
  • vue项目中如何引入cesium

    2024-05-28 15:52:29
  • Python&Matlab实现伏羲八卦图的绘制

    2023-02-01 02:42:39
  • Rs.Open参数说明

    2008-05-12 22:43:00
  • python Jupyter运行时间实例过程解析

    2022-04-15 04:38:21
  • Python实现猜拳与猜数字游戏的方法详解

    2022-06-17 18:32:25
  • python 决策树算法的实现

    2022-10-15 05:49:56
  • GOLANG版的冒泡排序和快速排序分享

    2023-07-05 05:31:09
  • python逆向微信指数爬取实现步骤

    2022-03-31 03:36:48
  • jupyter notebook参数化运行python方式

    2022-09-10 21:38:55
  • asp之家 网络编程 m.aspxhome.com