在使用解析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 JsonUnmStruct
unmarshalErr := 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 JsonUnmStruct
decodeErr := 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)