首頁 >後端開發 >Golang >在 Go 中解組 JSON 時如何保留 Int64 精確度?

在 Go 中解組 JSON 時如何保留 Int64 精確度?

Linda Hamilton
Linda Hamilton原創
2024-12-29 06:04:15285瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn