在 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 }
方案二:
也可以直接解码自定义数据结构:
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中文网其他相关文章!