golang中json反序列化可能遇到的問題
前言
在golang中,當浮點數(shù)超過一定數(shù)值的時候,golang會把它弄成科學計數(shù)法的形式進行顯示(好像只要大于七位數(shù)就變成科學計數(shù)法了)
var val float64 val = 1000000 fmt.Println(val) // ==> 1e+06
而在日常開發(fā)中,我們經(jīng)常遇到這樣一個問題,就是要反序列化前端傳遞來的json,因為數(shù)據(jù)結(jié)構(gòu)未知,所以我們便會使用map[string]interface{}來接收反序列化的結(jié)果。由于golang將json解析到interface{}類型的時候,遵循如下規(guī)則
- bool 代表 JSON booleans,
- float64 代表 JSON numbers,
- string 代表 JSON strings,
- nil 代表 JSON null.
所以如果我們接收到的json中存在一個比較大的數(shù)字,那么它就會被解析成float64類型的,并且有可能顯示為科學計數(shù)法的形式,比如下面這個例子
package main
import (
"encoding/json"
"fmt"
)
func main() {
//Create the Json string
var data = `
{
"id": 12423434,
"Name": "Fernando"
}
`
//Marshal the json to a map
var result map[string]interface{}
err := json.Unmarshal([]byte(data), &result)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(result)
}
輸出如下結(jié)果
map[id:1.2423434e+07 Name:Fernando]
這個時候如果把它傳遞給前端使用的話,那么前端是有可能會報錯的。所以我們最好還是保持這個數(shù)字的原始字符串表現(xiàn)形式。即使用json.Number類型來表示
所以換成如下代碼就可以了
package main
import (
"encoding/json"
"fmt"
"strings"
)
func main() {
//Create the Json string
var data = `
{
"id": 12423434,
"Name": "Fernando"
}
`
//Marshal the json to a map
var result map[string]interface{}
d := json.NewDecoder(strings.NewReader(data))
d.UseNumber()
err := d.Decode(&result)
if err != nil {
fmt.Println(err.Error())
return
}
// 此刻result["id"]的類型就是json.Number了 它的底層類型其實就是string
fmt.Println(result)
}
輸出如下結(jié)果
map[id:12423434 Name:Fernando]
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Go語言Elasticsearch數(shù)據(jù)清理工具思路詳解
這篇文章主要介紹了Go語言Elasticsearch數(shù)據(jù)清理工具思路詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10
Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn)
這篇文章主要為大家介紹了Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
gtoken替換jwt實現(xiàn)sso登錄的問題小結(jié)
這篇文章主要介紹了gtoken替換jwt實現(xiàn)sso登錄,主要介紹了替換jwt的原因分析及gtoken的優(yōu)勢,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
golang協(xié)程池模擬實現(xiàn)群發(fā)郵件功能
這篇文章主要介紹了golang協(xié)程池模擬實現(xiàn)群發(fā)郵件功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05

