在 Go 中解析 JSON 时保留 Int64 值
考虑以下 JSON 正文:
{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
使用 json 时Go 中的 .Unmarshal() 处理此 JSON,即 64 位整数值由于 Go 的 JSON 解析器的性质,(id) 通常会转换为 float64。如果您需要保留其精度,这可能会出现问题。
解决方案 1:自定义解码器
一种方法是使用自定义解码器和 json.Number 类型。 json.Number 是表示 JSON 数字文字的类型。
import ( "encoding/json" "fmt" "bytes" "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 }
解决方案 2:自定义结构
另一个选项是将 JSON 解码为自定义结构:特别匹配您的数据格式。
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 }
在此解决方案中,直接在结构中使用 uint64,确保保留 64 位整数值。
以上是在 Go 中解组 JSON 时如何保留 Int64 精度?的详细内容。更多信息请关注PHP中文网其他相关文章!