我在Go中处理一个json POST,它包含一个包含64位整数的对象数组。当使用json.Unmarshal时,这些值似乎被转换为float64,这不是很有帮助。
body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`)
var dat map[string]interface{}
if err := json.Unmarshal(body, &dat); err != nil {
panic(err)
}
tags := dat["tags"].([]interface{})
for i, tag := range tags {
fmt.Println("tag: ", i, " id: ", tag.(map[string]interface{})["id"].(int64))
}
有没有办法在json.unmarshal的输出中保留原来的int64?
Go Playground of above code
4条答案
按热度按时间mwkjh3gx1#
方案一
您可以使用解码器和数字解码器来解码您的数字而不会丢失:
Number
类型的定义如下:这意味着您可以轻松地将其转换为:
方案二
您还可以根据您的需求解码成特定的结构:
就我个人而言,我通常更喜欢这种解决方案,它感觉更有条理,更容易维护。
注意事项
如果你使用JSON,因为你的应用程序部分是JavaScript:JavaScript没有64位整数,但只有一种数字类型,即IEEE754双精度浮点数。因此,您无法在JavaScript中使用标准解析函数解析此JSON而不会有任何损失。
esbemjvw2#
简单一点:
qmelpv7a3#
我知道这是非常古老的,但这是我最终使用的解决方案
ajsxfq5m4#
我最近遇到过几次这种情况,为了简化这里的解析代码,我只是添加了一个简单的函数来解决这个问题。
下面是一个可运行的示例,只需要替换一行代码:Playground:https://go.dev/play/p/Gi8mxssUrVP
您可以在这里找到更多信息:https://github.com/sleagon/g/pull/1