ホームページ >バックエンド開発 >Golang >Go で JSON を解析するときに 64 ビット整数の精度を維持するにはどうすればよいですか?

Go で JSON を解析するときに 64 ビット整数の精度を維持するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-09 11:31:16978ブラウズ

How to Preserve 64-Bit Integer Precision When Parsing JSON in Go?

Go での JSON 解析中に 64 ビット整数値を保持する

Go では、64 ビット整数値を含む JSON データを解析すると、次のような結果が生じる可能性があります。 float64 値に変換されるため、精度が失われます。この記事では、JSON 解析中に元の整数値を保持するための 2 つの解決策を紹介することで、この問題に対処します。

解決策 1: Decoder と UseNumber を使用する

Decoder 型の UseNumber を使用するメソッドを使用すると、数値を float64 値ではなく json.Number オブジェクトとして扱うようにデコーダーに指示できます。 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 倍精度のみをサポートすることに注意してください。 float 値であり、真の 64 ビット整数がありません。これは、Go で使用されるメソッドに関係なく、このような JSON データを JavaScript で解析すると精度が失われることを意味します。

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

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