Go で JSON を解析するときに Int64 値を保持する
Go で JSON データを解析するとき、json.Unmarshal 関数は多くの場合、大きな整数値を次のように変換します。 float64 型。メンテナンスに問題が生じる可能性があります。
解決策 1:
元の int64 値を保存するには、デコーダと UseNumber オプションを使用します:
package main import ( "encoding/json" "fmt" "bytes" "strconv" ) func main() { body := []byte("{\"tags\":[{\"id\":4418489049307132905},{\"id\":4418489049307132906}]}") d := json.NewDecoder(bytes.NewBuffer(body)) // Enable number preservation d.UseNumber() var dat map[string]interface{} 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:
または、次のこともできます。カスタム データ構造に直接デコードします:
package main 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 }
注意:
JavaScript の数値型は IEEE754 倍精度浮動小数点であることに注意してください。これは、64 ビットを表現できないことを意味します精度を失うことなく整数を変換できます。
以上がGo で JSON を解析するときに Int64 の精度を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。