首页 >后端开发 >Golang >如何在 Go 中保持 JSON 整数精度?

如何在 Go 中保持 JSON 整数精度?

Patricia Arquette
Patricia Arquette原创
2024-12-20 10:01:11855浏览

How to Preserve JSON Integer Precision in Go?

在 Go 中导航 JSON 数字精度

在 Go 中解析 JSON 时,默认 JSON 解码器可能会自动将大于 32 位的整数转换为 float64 值。当您需要保持此类整数的准确性时,这会带来挑战。

此问题的一种解决方案是使用自定义解码器并采用 UseNumber 方法。这使您能够将数字解码为 json.Number 类型,该类型可以轻松转换回整数。

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "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
}

或者,您可以设计一个自定义数据结构来匹配您的 JSON 模式,它可以处理任何大小的整数。

package main

import "encoding/json"
import "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
}

请记住,如果您的应用程序与缺乏真正的 64 位整数的 JavaScript 进行通信,您可能会遇到数据丢失的情况在编组和解组期间。

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

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