在我的 Go 代碼中,我正在努力解組我們從端點接收到的 JSON 有效負載。此端點以科學計數法對大值進行編碼:type Test struct { Key string Value int32}func main() { data := []byte("{\"Key\": \"derp\", \"Value\": 3.898733e+06}") var t *Test err := json.Unmarshal(data, &t) fmt.Printf("Error: %v\n", err) fmt.Printf("Data: %v\n", t)}此處的編碼值相當于標準表示法中的 3,898,733。但是,此代碼會打印錯誤:json:無法將數字 3.898733e+06 解組到 int32 類型的 Go 結構字段 Test.Value這是有道理的,因為strconv也無法從字符串中解析此值。但是,我可以做到var i int32 = 3.898733e+06,并且可以編譯并生成正確的答案。那么,我該如何解決這個錯誤呢?
1 回答

慕慕森
TA貢獻1856條經驗 獲得超17個贊
該聲明var i int32 = 3.898733e+06
有效是因為此表達式中的文字是無類型常量,并且無類型常量是根據上下文計算的。在這種情況下,即使它被寫為浮點數,它在編譯時也被解釋為 int32。這不會在運行時發生。
有幾個選項可以使它適用于 JSON 封送處理:
聲明
Value
為json.Number
。通過這種方式,您可以嘗試將其解析為 int64,如果失敗,則將其解析為 float64,然后轉換為 int64,希望您不會失去精度。定義一個自定義類型并自己解組:
type LongInt int32
func (i *LongInt) UnmarshalJSON(data []byte) error {
// Parse data yourself and set the int value
// Maybe use big.Int?
}
聲明Value為float64
- 1 回答
- 0 關注
- 92 瀏覽
添加回答
舉報
0/150
提交
取消