在 Go 中解析 JSON 期间保留 64 位整数值
在 Go 中,解析包含 64 位整数值的 JSON 数据可能会导致它们转换为 float64 值,导致精度损失。本文通过提供两种在 JSON 解析期间保留原始整数值的解决方案来解决此问题。
解决方案 1:使用 Decoder 和 UseNumber
通过使用 Decoder 类型的 UseNumber方法,可以指示解码器将数值视为 json.Number 对象而不是 float64 值。 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 double精度浮点值并且缺乏真正的 64 位整数。这意味着无论 Go 中使用什么方法,在 JavaScript 中解析此类 JSON 数据都会导致精度损失。
以上是在 Go 中解析 JSON 时如何保留 64 位整数精度?的详细内容。更多信息请关注PHP中文网其他相关文章!