标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。