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

在 Go 中解析 JSON 时如何保持 Int64 精度?

Mary-Kate Olsen
发布: 2024-12-08 07:32:27
原创
216 人浏览过

How to Preserve Int64 Precision When Parsing JSON in Go?

在 Go 中解析 JSON 时保留 Int64 值

在 Go 中解析 JSON 数据时,json.Unmarshal 函数通常会将大整数值转换为float64 类型,这可能会给维护带来问题

解决方案 1:

要保留原始 int64 值,请使用解码器和 UseNumber 选项:

package main

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

func main() {
    body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}")
    d := json.NewDecoder(bytes.NewBuffer(body))

    // Enable number preservation
    d.UseNumber()

    var dat map[string]interface{}
    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
}
登录后复制

方案二:

也可以直接解码自定义数据结构:

package main

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
}
登录后复制

注意:

请注意,JavaScript 的数字类型是 IEEE754 双精度浮点数,这意味着它无法表示 64 位整数失去精度。

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

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