首頁 >後端開發 >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