首页 > 后端开发 > Golang > 在 Go 中解组 JSON 时如何保留 Int64 精度?

在 Go 中解组 JSON 时如何保留 Int64 精度?

Linda Hamilton
发布: 2024-12-29 06:04:15
原创
249 人浏览过

How to Preserve Int64 Precision When Unmarshalling JSON in Go?

在 Go 中解析 JSON 时保留 Int64 值

考虑以下 JSON 正文:

{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
登录后复制

使用 json 时Go 中的 .Unmarshal() 处理此 JSON,即 64 位整数值由于 Go 的 JSON 解析器的性质,(id) 通常会转换为 float64。如果您需要保留其精度,这可能会出现问题。

解决方案 1:自定义解码器

一种方法是使用自定义解码器和 json.Number 类型。 json.Number 是表示 JSON 数字文字的类型。

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

func main() {
    body := []byte(`{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}`)
    dat := make(map[string]interface{})
    d := json.NewDecoder(bytes.NewBuffer(body))
    d.UseNumber()
    if err := d.Decode(&dat); err != nil {
        panic(err)
    }
    tags := dat["tags"].([]interface{})
    n := tags[0].(map[string]interface{})["id"].(json.Number)
    i64, _ := strconv.ParseUint(string(n), 10, 64)
    fmt.Println(i64) // Prints 4418489049307132905
}
登录后复制

解决方案 2:自定义结构

另一个选项是将 JSON 解码为自定义结构:特别匹配您的数据格式。

import (
    "encoding/json"
    "fmt"
)

type A struct {
    Tags []map[string]uint64 // "tags"
}

func main() {
    body := []byte(`{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}`)
    var a A
    if err := json.Unmarshal(body, &a); err != nil {
        panic(err)
    }
    fmt.Println(a.Tags[0]["id"]) // Logs 4418489049307132905
}
登录后复制

在此解决方案中,直接在结构中使用 uint64,确保保留 64 位整数值。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板