在使用解析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)
参考链接