首页 >后端开发 >Golang >在 Go 中解析 JSON 时如何保留 64 位整数精度?

在 Go 中解析 JSON 时如何保留 64 位整数精度?

Susan Sarandon
Susan Sarandon原创
2024-12-09 11:31:16984浏览

How to Preserve 64-Bit Integer Precision When Parsing JSON in Go?

在 Go 中解析 JSON 期间保留 64 位整数值

在 Go 中,解析包含 64 位整数值的 JSON 数据可能会导致它们转换为 float64 值,导致精度损失。本文通过提供两种在 JSON 解析期间保留原始整数值的解决方案来解决此问题。

解决方案 1:使用 Decoder 和 UseNumber

通过使用 Decoder 类型的 UseNumber方法,可以指示解码器将数值视为 json.Number 对象而不是 float64 值。 json.Number 可以分别使用 ParseUint 或 ParseInt 函数轻松转换为 uint64 或 int64 类型。

示例:

import (
    "encoding/json"
    "bytes"
    "fmt"
    "strconv"
)

body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`)

d := json.NewDecoder(bytes.NewBuffer(body))
d.UseNumber()
var dat map[string]interface{}
err := d.Decode(&dat)

tags := dat["tags"].([]interface{})
value := tags[0].(map[string]interface{})["id"].(json.Number)
id, _ := strconv.ParseUint(string(value), 10, 64)

fmt.Println(id) // Prints 4418489049307132905

解决方案 2:解码为自定义结构

定义与 JSON 数据结构匹配的自定义结构允许将整数值直接分配给整数字段。这样就无需进一步转换或操作数据。

示例:

import (
    "encoding/json"
    "fmt"
)

type Tag struct {
    Id uint64 `json:"id"`
}

type Data struct {
    Tags []Tag `json:"tags"`
}

body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`)
var data Data
json.Unmarshal(body, &data)

fmt.Println(data.Tags[0].Id) // Logs 4418489049307132905

注意:

如果 JSON 数据源自使用 JavaScript 的源,则值得注意的是 JavaScript 仅支持 IEEE754 double精度浮点值并且缺乏真正的 64 位整数。这意味着无论 Go 中使用什么方法,在 JavaScript 中解析此类 JSON 数据都会导致精度损失。

以上是在 Go 中解析 JSON 时如何保留 64 位整数精度?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn