在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中文網其他相關文章!