在使用解析json
結構體的時候,使用interface{}
接數字會發現變成了科學計數法格式的數字,不符合實際場景的使用要求。
舉例代碼如下:
type JsonUnmStruct struct {Id interface{} `json:"id"`Name string `json:"name"`
}func Test_JsonUnmErr(t *testing.T) {var b = []byte(`{"id": 12423434, "Name": "Tom"}`)var f JsonUnmStructunmarshalErr := json.Unmarshal(b, &f)if unmarshalErr != nil {t.Fatal(unmarshalErr)}t.Logf("%+v", f)
}
實際上的輸出結果是:
=== RUN Test_JsonUnmErr
json_unm_test.go:27: {Id:1.2423434e+07 Name:Tom}
— PASS: Test_JsonUnmErr (0.00s)
如果想要數字以不變的方式來進行序列化/反序列化,可以使用json.Decoder
的UseNumber
方法,它會把所有的數字解析為json.Number
類型的數(是數字的原始字符串的表示形式)
具體代碼如下:
func Test_JsonUnmCorrect(t *testing.T) {var b = []byte(`{"id": 12423434, "Name": "Tom"}`)d := json.NewDecoder(strings.NewReader(string(b)))d.UseNumber()var f JsonUnmStructdecodeErr := d.Decode(&f)if decodeErr != nil {t.Fatal(decodeErr)}t.Logf("%+v", f)
}
輸出結果
=== RUN Test_JsonUnmCorrect
json_unm_test.go:44: {Id:12423434 Name:Tom}
— PASS: Test_JsonUnmCorrect (0.00s)
參考鏈接