ホームページ >バックエンド開発 >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 値に自動的に変換される場合があります。このような整数の精度を維持する必要がある場合、これが課題となります。

この問題に対する 1 つの解決策は、カスタム デコーダを使用し、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
}

アプリケーションが JavaScript と通信する場合、JavaScript には true が欠けていることに注意してください。 64 ビット整数では、マーシャリングおよびアンマーシャリング中にデータ損失が発生する可能性があります。

以上がGo で JSON 整数の精度を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。