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