ホームページ > バックエンド開発 > Golang > Go で JSON をアンマーシャリングするときに Int64 の精度を維持するにはどうすればよいですか?

Go で JSON をアンマーシャリングするときに Int64 の精度を維持するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-29 06:04:15
オリジナル
249 人が閲覧しました

How to Preserve Int64 Precision When Unmarshalling JSON in Go?

Go で JSON を解析するときに Int64 値を保持する

次の JSON 本文を考慮します。

{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
ログイン後にコピー

json を使用する場合この JSON (64 ビット) を処理するための Go の .Unmarshal() Go の JSON パーサーの性質により、整数値 (id) は多くの場合 float64 に変換されます。精度を維持する必要がある場合、これは問題になる可能性があります。

解決策 1: カスタム デコーダー

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: カスタム構造

もう 1 つのオプションは、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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート