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