golang內置的json反序列化方法,默認情況下對應?未指定類型interface{} 類型的的 int類型數據在經過Unmarshal解碼后 int類型的數據會變成 float64類型。 因為json里面默認將interface{}類型的int數據都當做float64來處理。? ?解決方法很簡單,就是使用自定義的解碼器,然后調用解碼器中的?UseNumber()方法即可。
// 使用自定義的json解碼jdecoder := json.NewDecoder(bytes.NewReader(bdata))jdecoder.UseNumber() // 使用數字解碼JSON數據,避免 int 類型數據變成float64類型err = jdecoder.Decode(m)if err != nil {return err}
這里的 bdata是你json編碼后的字節切片? bdata, err := json.Marshal(data)? 【此處的data 則是任何可被 json.Marshal序列化的數據】
注意在使用了.UseNumber() 方法后,數據中所有的interface{}類型的 int 類型數據都會被轉換為 json.Number類型輸出。
這個json.Number是json里面定義的一個類型,他有3個方法,即
type Number stringfunc (n json.Number) Float64() (float64, error)
func (n json.Number) Int64() (int64, error)
func (n json.Number) String() string // 這個String()是對象的字符串輸出接口的實現
我們在使用.UseNumber() 方法后可根據我們的需要對這個類型進行一個轉換處理,如果不處理直接輸出的話就是字符串, 如果想要變成int64輸出,則需要調用哦 Int64方法進行轉換。
轉換示例:
// 對val類型進行斷言,如果是json.Number才進行處理
if v, ok := val.(json.Number); ok {// 調用json.Number中的Int64()方法轉換數據類型為int64if i64v, err := v.Int64(); err == nil {// 修改你序列化后的數據為這里的i64v 即 int64類型//....}
}