golang中json反序列化可能遇到的問(wèn)題
前言
在golang中,當(dāng)浮點(diǎn)數(shù)超過(guò)一定數(shù)值的時(shí)候,golang會(huì)把它弄成科學(xué)計(jì)數(shù)法的形式進(jìn)行顯示(好像只要大于七位數(shù)就變成科學(xué)計(jì)數(shù)法了)
var val float64 val = 1000000 fmt.Println(val) // ==> 1e+06
而在日常開(kāi)發(fā)中,我們經(jīng)常遇到這樣一個(gè)問(wèn)題,就是要反序列化前端傳遞來(lái)的json,因?yàn)閿?shù)據(jù)結(jié)構(gòu)未知,所以我們便會(huì)使用map[string]interface{}來(lái)接收反序列化的結(jié)果。由于golang將json解析到interface{}類型的時(shí)候,遵循如下規(guī)則
- bool 代表 JSON booleans,
- float64 代表 JSON numbers,
- string 代表 JSON strings,
- nil 代表 JSON null.
所以如果我們接收到的json中存在一個(gè)比較大的數(shù)字,那么它就會(huì)被解析成float64類型的,并且有可能顯示為科學(xué)計(jì)數(shù)法的形式,比如下面這個(gè)例子
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]
這個(gè)時(shí)候如果把它傳遞給前端使用的話,那么前端是有可能會(huì)報(bào)錯(cuò)的。所以我們最好還是保持這個(gè)數(shù)字的原始字符串表現(xiàn)形式。即使用json.Number類型來(lái)表示
所以換成如下代碼就可以了
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了 它的底層類型其實(shí)就是string
fmt.Println(result)
}
輸出如下結(jié)果
map[id:12423434 Name:Fernando]
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
深入了解Golang?interface{}的底層原理實(shí)現(xiàn)
在?Go?語(yǔ)言沒(méi)有泛型之前,接口可以作為一種替代實(shí)現(xiàn),也就是萬(wàn)物皆為的?interface。那到底?interface?是怎么設(shè)計(jì)的底層結(jié)構(gòu)呢?下面咱們透過(guò)底層分別看一下這兩種類型的接口原理。感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助2022-10-10
Golang 如何限制木馬圖片上傳服務(wù)器的實(shí)例
本文主要介紹了Golang 如何限制木馬圖片上傳服務(wù)器的實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
手把手教你vscode配置golang開(kāi)發(fā)環(huán)境的步驟
這篇文章主要介紹了手把手教你vscode配置golang開(kāi)發(fā)環(huán)境的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Go操作mongodb數(shù)據(jù)庫(kù)方法示例
這篇文章主要為大家介紹了Go操作mongodb數(shù)據(jù)庫(kù)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解
這篇文章主要為大家介紹了Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
GO中高效的將int轉(zhuǎn)換為string的方法與源碼
本文將從逐步介紹幾種在?Go?中將?int?轉(zhuǎn)換為?string?的常見(jiàn)方法,并重點(diǎn)剖析這幾種方法在性能上的特點(diǎn),另外,還會(huì)重點(diǎn)介紹?FormatInt?高效的算法實(shí)現(xiàn),需要的朋友可以參考下2024-01-01

