Go 语言json.Unmarshal 遇到的小问题(推荐)
1.问题现象描述
使用json.Unmarshal(),反序列化时,出现了科学计数法,参考代码如下:
jsonStr:=`{"number":1234567}` result:=make(map[string]interface{}) err:=json.Unmarshal([]byte(jsonStr),&result) iferr!=nil{ fmt.Println(err) } fmt.Println(result) //输出 //map[number:1.234567e+06]
这个问题不是必现,只有当数字的位数大于6位时,才会变成了科学计数法。
2.问题影响描述
当数据结构未知,使用map[string]interface{}来接收反序列化结果时,如果数字的位数大于6位,都会变成科学计数法,用到的地方都会受到影响。
3.引起问题的原因
从encoding/json可以找到答案,看一下这段注释:
//TounmarshalJSONintoaninterfacevalue, //Unmarshalstoresoneoftheseintheinterfacevalue: // // bool,forJSONbooleans // float64,forJSONnumbers // string,forJSONstrings // []interface{},forJSONarrays // map[string]interface{},forJSONobjects // nilforJSONnull
是因为当JSON中存在一个比较大的数字时,它会被解析成float64类型,就有可能会出现科学计数法的形式。
4.问题的解决方案
方案一
强制类型转换,参考代码如下:
jsonStr:=`{"number":1234567}` result:=make(map[string]interface{}) err:=json.Unmarshal([]byte(jsonStr),&result) iferr!=nil{ fmt.Println(err) } fmt.Println(int(result["number"].(float64))) //输出 //1234567
方案二
尽量避免使用interface,对json字符串结构定义结构体,快捷方法可使用在线工具:https://mholt.github.io/json-to-go/。
typeNumstruct{ Numberint`json:"number"` } jsonStr:=`{"number":1234567}` varresultNum err:=json.Unmarshal([]byte(jsonStr),&result) iferr!=nil{ fmt.Println(err) } fmt.Println(result) //输出 //{1234567}
方案三
使用UseNumber()方法。
jsonStr:=`{"number":1234567}` result:=make(map[string]interface{}) d:=json.NewDecoder(bytes.NewReader([]byte(jsonStr))) d.UseNumber() err:=d.Decode(&result) iferr!=nil{ fmt.Println(err) } fmt.Println(result) //输出 //map[number:1234567]
这时一定要注意result["number"]的数据类型!
fmt.Println(fmt.Sprintf("type:%v",reflect.TypeOf(result["number"]))) //输出 //type:json.Number
通过代码可以看出json.Number其实就是字符串类型:
//ANumberrepresentsaJSONnumberliteral. typeNumberstring
如果转换其他类型,参考如下代码:
//转成int64 numInt,_:=result["number"].(json.Number).Int64() fmt.Println(fmt.Sprintf("value:%v,type:%v",numInt,reflect.TypeOf(numInt))) //输出 //value:1234567,type:int64 //转成string numStr:=result["number"].(json.Number).String() fmt.Println(fmt.Sprintf("value:%v,type:%v",numStr,reflect.TypeOf(numStr))) //输出 //value:1234567,type:string
到此这篇关于Go语言json.Unmarshal遇到的小问题(推荐)的文章就介绍到这了,更多相关Go语言json.Unmarshal内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!