欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go 語言json.Unmarshal 遇到的小問題(推薦)

 更新時間:2020年07月11日 11:41:47   作者:新亮筆記  
這篇文章主要介紹了 Go 語言json.Unmarshal 遇到的小問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1.問題現(xiàn)象描述

使用 json.Unmarshal(),反序列化時,出現(xiàn)了科學(xué)計數(shù)法,參考代碼如下:

jsonStr := `{"number":1234567}`
result := make(map[string]interface{})
err := json.Unmarshal([]byte(jsonStr), &result)
if err != nil {
	fmt.Println(err)
}
fmt.Println(result)

// 輸出
// map[number:1.234567e+06]

這個問題不是必現(xiàn),只有當(dāng)數(shù)字的位數(shù)大于 6 位時,才會變成了科學(xué)計數(shù)法。

2.問題影響描述

當(dāng)數(shù)據(jù)結(jié)構(gòu)未知,使用 map[string]interface{} 來接收反序列化結(jié)果時,如果數(shù)字的位數(shù)大于 6 位,都會變成科學(xué)計數(shù)法,用到的地方都會受到影響。

3.引起問題的原因

encoding/json 可以找到答案,看一下這段注釋:

// To unmarshal JSON into an interface value,
// Unmarshal stores one of these in the interface value:
//
//	bool, for JSON booleans
//	float64, for JSON numbers
//	string, for JSON strings
//	[]interface{}, for JSON arrays
//	map[string]interface{}, for JSON objects
//	nil for JSON null

是因為當(dāng) JSON 中存在一個比較大的數(shù)字時,它會被解析成 float64 類型,就有可能會出現(xiàn)科學(xué)計數(shù)法的形式。

4.問題的解決方案

方案一

強制類型轉(zhuǎn)換,參考代碼如下:

jsonStr := `{"number":1234567}`
result := make(map[string]interface{})
err := json.Unmarshal([]byte(jsonStr), &result)
if err != nil {
	fmt.Println(err)
}
fmt.Println(int(result["number"].(float64)))

// 輸出
// 1234567

方案二

盡量避免使用 interface,對 json 字符串結(jié)構(gòu)定義結(jié)構(gòu)體,快捷方法可使用在線工具:https://mholt.github.io/json-to-go/

type Num struct {
	Number int `json:"number"`
}

jsonStr := `{"number":1234567}`
var result Num
err := json.Unmarshal([]byte(jsonStr), &result)
if err != 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)
if err != nil {
	fmt.Println(err)
}
fmt.Println(result)

// 輸出
// map[number:1234567]

這時一定要注意 result["number"] 的數(shù)據(jù)類型!

fmt.Println(fmt.Sprintf("type: %v", reflect.TypeOf(result["number"])))

// 輸出
// type: json.Number

通過代碼可以看出 json.Number 其實就是字符串類型:

// A Number represents a JSON number literal.
type Number string

如果轉(zhuǎn)換其他類型,參考如下代碼:

// 轉(zhuǎn)成 int64
numInt, _ := result["number"].(json.Number).Int64()
fmt.Println(fmt.Sprintf("value: %v, type: %v", numInt, reflect.TypeOf(numInt)))

// 輸出
// value: 1234567, type: int64

// 轉(zhuǎn)成 string
numStr := result["number"].(json.Number).String()
fmt.Println(fmt.Sprintf("value: %v, type: %v", numStr, reflect.TypeOf(numStr)))

// 輸出
// value: 1234567, type: string

到此這篇關(guān)于Go 語言json.Unmarshal 遇到的小問題(推薦)的文章就介紹到這了,更多相關(guān)Go 語言json.Unmarshal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Hugo?Config模塊構(gòu)建實現(xiàn)源碼剖析

    Hugo?Config模塊構(gòu)建實現(xiàn)源碼剖析

    這篇文章主要為大家介紹了Hugo?Config模塊構(gòu)建實現(xiàn)源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • go mod tidy加載模塊超時的問題及解決

    go mod tidy加載模塊超時的問題及解決

    go mod tidy加載模塊超時的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 使用Golang實現(xiàn)Sm2加解密的代碼詳解

    使用Golang實現(xiàn)Sm2加解密的代碼詳解

    本文主要介紹了Go語言實現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Golang利用Template模板動態(tài)生成文本

    Golang利用Template模板動態(tài)生成文本

    Go語言中的Go?Template是一種用于生成文本輸出的簡單而強大的模板引擎,它提供了一種靈活的方式來生成各種格式的文本,下面我們就來看看具體如何使用Template實現(xiàn)動態(tài)文本生成吧
    2023-09-09
  • Go語言寫入字符串到文件的方法

    Go語言寫入字符串到文件的方法

    這篇文章主要介紹了Go語言寫入字符串到文件的方法,實例分析了Go語言操作字符串及文本的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • goFrame的隊列g(shù)queue對比channel使用詳解

    goFrame的隊列g(shù)queue對比channel使用詳解

    這篇文章主要為大家介紹了goFrame的gqueue對比channel使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 淺析Go語言bitset的實現(xiàn)原理

    淺析Go語言bitset的實現(xiàn)原理

    bitset包是一個將非負(fù)整數(shù)映射到布爾值的位的集合,這篇文章主要通過開源包bitset來為大家分析一下位集合的設(shè)計和實現(xiàn),感興趣的可以學(xué)習(xí)一下
    2023-08-08
  • golang實現(xiàn)循環(huán)隊列的示例代碼

    golang實現(xiàn)循環(huán)隊列的示例代碼

    循環(huán)隊列是一種使用固定大小的數(shù)組來實現(xiàn)隊列的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了golang實現(xiàn)循環(huán)隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Golang設(shè)計模式之工廠方法模式講解和代碼示例

    Golang設(shè)計模式之工廠方法模式講解和代碼示例

    工廠方法是一種創(chuàng)建型設(shè)計模式, 解決了在不指定具體類的情況下創(chuàng)建產(chǎn)品對象的問題,本文將通過代碼示例詳細(xì)給大家介紹一下Golang工廠方法模式,感興趣的同學(xué)可以參考一下
    2023-06-06
  • 在Go程序中實現(xiàn)服務(wù)器重啟的方法

    在Go程序中實現(xiàn)服務(wù)器重啟的方法

    這篇文章主要介紹了在Go程序中實現(xiàn)服務(wù)器重啟的方法,由于很多人盲目崇拜谷歌"親爹",Go語言在國內(nèi)有著不尋常的人氣,需要的朋友可以參考下
    2015-06-06

最新評論