主頁(yè) > 知識(shí)庫(kù) > golang中json反序列化可能遇到的問(wèn)題

golang中json反序列化可能遇到的問(wèn)題

熱門標(biāo)簽:服務(wù)外包 AI電銷 Linux服務(wù)器 地方門戶網(wǎng)站 鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化 百度競(jìng)價(jià)排名 呼叫中心市場(chǎng)需求

前言

在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ì)腳本之家的支持。

您可能感興趣的文章:
  • golang的序列化與反序列化的幾種方式

標(biāo)簽:仙桃 黃山 銅川 湘潭 蘭州 崇左 衡水 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang中json反序列化可能遇到的問(wèn)題》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266