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 サイトの他の関連記事を参照してください。