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