golang 未指定类型interface{} 类型的 int类型数据json.Unmarshal 解码后变成float64类型问题解决方法

golang内置的json反序列化方法,默认情况下对应 未指定类型interface{} 类型的的 int类型数据在经过Unmarshal解码后 int类型的数据会变成 float64类型。 因为json里面默认将interface{}类型的int数据都当做float64来处理。 解决方法很简单,就是使用自定义的解码器,然后调用解码器中的 UseNumber()方法即可。

Go 复制代码
    // 使用自定义的json解码
	jdecoder := json.NewDecoder(bytes.NewReader(bdata))
	jdecoder.UseNumber() // 使用数字解码JSON数据,避免 int 类型数据变成float64类型
	err = jdecoder.Decode(m)
	if err != nil {
		return err
	}

这里的 bdata是你json编码后的字节切片 bdata, err := json.Marshal(data) 【此处的data 则是任何可被 json.Marshal序列化的数据】

注意在使用了.UseNumber() 方法后,数据中所有的interface{}类型的 int 类型数据都会被转换为 json.Number类型输出。

这个json.Number是json里面定义的一个类型,他有3个方法,即

Go 复制代码
type Number string

func (n json.Number) Float64() (float64, error)
func (n json.Number) Int64() (int64, error)
func (n json.Number) String() string  // 这个String()是对象的字符串输出接口的实现

我们在使用.UseNumber() 方法后可根据我们的需要对这个类型进行一个转换处理,如果不处理直接输出的话就是字符串, 如果想要变成int64输出,则需要调用哦 Int64方法进行转换。

转换示例:

Go 复制代码
// 对val类型进行断言,如果是json.Number才进行处理
if v, ok := val.(json.Number); ok {
	// 调用json.Number中的Int64()方法转换数据类型为int64
	if i64v, err := v.Int64(); err == nil {
		// 修改你序列化后的数据为这里的i64v  即 int64类型
		//....
	}
}
相关推荐
Brilliantwxx几秒前
【STM32】 从HAL库源码深度解析I2C(源码解析+面试题)
开发语言·stm32·单片机·嵌入式硬件·架构
铁皮饭盒4 分钟前
网页端, 40mb离线模型, 自动抠图, 不用 Python,不用服务器,不用 API Key, 不用显卡
前端·javascript·后端
小白学大数据13 分钟前
Python 小工具实战:用问财接口搭建金融数据采集器
开发语言·人工智能·python
报错小能手14 分钟前
GO语言接口 泛型 错误处理
golang
泡海椒15 分钟前
jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑
java·开发语言·pdf
IT_陈寒17 分钟前
Redis并发写入踩坑记录:别让超时设置坑了你
前端·人工智能·后端
Bs_MoneyMagnet23 分钟前
基于springboot+vue的图书馆预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·图书管理系统·计算机毕业设计
console.log('npc')33 分钟前
03 — 核心框架:App 与中间件
后端·node.js·express
小蒜学长34 分钟前
基于小程序的绘画作品创作与分享社区系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·绘画作品·创作分享社区
江湖十年44 分钟前
Go GOPROXY 兜底链的坑:从一次诡异的 CI lint 失败说起
后端·面试·go