文章目录
使用Go解析一个从其他接口返回的JSON字符串,有时会遇到数字以科学计数法的形式展现,比如
源:
1
| {"message": "success", "data": 6566651968}
|
处理后:
1
| {"message": "success", "data": 6.566651968e+09}
|
Go程序大体如下:
1 2 3 4 5 6 7 8 9 10 11 12
| func xxxx() { v := make(map[string]interface{})
err = json.Unmarshal(body, &v) if err != nil { } ... }
|
例如Python遇到普通数值解析出来为int, 碰到科学技术法解析出来则为float:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| >>> import json
>>> d = json.loads('{"retval": 0, "message": "success", "data": 5678000}') >>> d['data'] 5678000 >>> type(d['data']) <type 'int'>
>>> d = json.loads('{"retval": 0, "message": "success", "data": 5.678E7}') >>> d['data'] 56780000.0 >>> type(d['data']) <type 'float'>
|
为什么会这么处理? Go官方文档的说明:
To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:
float64, for JSON numbers
解决方案是使用Decoder.UseNumber方法, 可以简单看下这个回答
修改后Go代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| func xxxx() { v := make(map[string]interface{})
d := json.NewDecoder(bytes.NewReader(body)) d.UseNumber() err = d.Decode(&v) if err != nil { }
... }
|