ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

不要将带有 int64 的数据反序列化到 map[string]interface{} 中

2021-03-06 13:01:36  阅读:186  来源: 互联网

标签:map string json m1 interface orgId 序列化


我们知道,在 Go 语言中,有一种 map 数据类型,当我们需要向哈希表中存入不确定类型的数据时,我们可能会用到 map[string]interface{}

m1 := make(map[string]interface{}, 0)
m1["name"] = "user1"
m1["age"] = 21
m1["weight"] = 130.5

当向其中存储一些数据后,当我们遍历它,就能拿到自己想要的结果:

for k, v := range m1 {
	fmt.Printf("%s-%s\n", k, v)
}

我们再看复杂一点的示例,服务 a,调用服务 b,获取用户信息。

服务 b 返回 json 给服务 a:{"name": "user1","userId":3,"orgId":202505060582035456}

// 服务 a 得到用户信息
// 经过服务内部的接口通讯,会对数据 json 序列化和反序列化:
json1 := `{"name": "user1","userId":3,"orgId":202505060582035456}`
m1 := make(map[string]interface{}, 0)
json.FromJson(json1, &m1)
for k, v := range m1 {
	fmt.Printf("%s-%s\n", k, v)
}
t.Log(json.ToJsonIgnoreError(m1))

使用 map[string]interface{} 数据接受 json 数据,会使得数值类型的数据被默认为 float64 类型。

在上面的遍历过程中,我们可能会发现,在 for 语句体中,orgId 对应的值被默认为 float64 类型,这是 go 语言内部的机制,先不予讨论。

这里要说的是在这种情况下,会出问题,因为 float64 不能存放 int64 的最大值,到了一定的情况下,会损失精度。上述示例中,便利得到的 orgId 值为 202505060582035460,和原始的 202505060582035456 不一致,此时就会导致比较严重的问题,比如查询用户企业查询不到等。

要解决这个问题,办法有多种,比如我们可以让,数据反序列化到结构体中:

type User struct {
	Name     string `json:"name"`
	UserId   int64  `json:"userId"`
	OrgId    int64  `json:"orgId"`
}
user := User{}
json.FromJson(json1, &user)

标签:map,string,json,m1,interface,orgId,序列化
来源: https://www.cnblogs.com/ishenghuo/p/14490278.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有