Golang JSON的高階用法例項講解

2022-09-24 14:51:16 字數 1930 閱讀 1917

痛點

json 是當前最常用的資料傳輸格式之一,純文字,容易使用,方便閱讀,在通訊過程中大量被使用。 

你是否遇到過json中某個字段填入某種型別都適合而陷入兩難境地? (例如:定義了乙個port欄位,你wcasu卻不知道是填入 8080 ,還是 「8080」 的尷尬局面)

你是否遇到過json反解析報錯是因為填入欄位的型別不匹配導致的?例如:

json: cannot unmarshal number into go struct field host.port of type string

你是否有json某欄位相容2種或者多種的資料結構的需求?

你是否想讓程式更優雅,更具有適配性,而不在被這些小細節頭痛?

如果你有或者你想,獲取你可以看看這篇文章。

重現問題

我們給了使用者乙個json如下:

但是,業務方卻誤填了」8080」,結果我們程式反解析報錯,導致業務失敗。

json: cannot unmarshal number into go struct field host.port of type string

程式設計客棧

或許你認為這是業務方的問題,但我認為我們可以更優雅的解決這個問題。

程式設計客棧如何解決問題

我們先定義了乙個結構體

type host struct

心細的你會發現,port既不是int也不是string型別,而是port型別,而port型別是:

type type int

const (

int type = iota

string

)type port struct

在port結構體中,我們發現了type型別, 而type型別包括了int,string兩種型別。接下來就非常重要了,我們需要實現以下這兩個介面。

json.unmarshaller inte***ce

json.marshaller inte***ce

實現**如下:

type port struct

// 實現 json.unmarshaller 介面

func (port *port) unmarshaljson(value byte) error

port.type = int

return json.unmarshal(value, &port.intval)

}// 實現 json.marshaller 介面

func (port port) marshaljson() (byte, error) , fmt.errorf("impossible port.type")

}}接下來測試:

測試反解析

測試反解析int

給出json資料:

反解析得到的結構體資料如下:

&}測試反解析string:

給出json資料:

反解析得到的結構體資料如下:

&}測試編碼的json

測試編碼int的結構體如下:

host := &host,

}編碼後的json如下:

測試編碼string的結構體如下:

host := &host,

}編碼後的json資料如下:

在反編碼測試中,你會發現當json填入的型別不同時,會編碼到結構體中對應的字段中。

在編碼測試中, 具體編碼那個資料是由type來確定的。

總結其實,這篇文章只是分享了下json中使用的小技巧,他打破了在使用json時,需要呆板的資料結構的印象,轉而走向了多變,靈活跳脫的風格,其實,這這個小tips的核心在於實現unmarshaller,marshaller這兩個結構體,他們的實現是這個分享的關鍵,當然,你可以實現如開篇所說的那樣,json某欄位相容2種及以上結構,當然,你也可以對yaml,toml等進行折騰,都會得到你想要的答案。

本文標題: golang json的高階用法例項講解

本文位址:

Golang json用法詳解

簡介 json格式可以算我們日常最常用的序列化格式之一了,go語言作為乙個由google開發,號稱網際網路的c語言的語言,自然也對json格式支援很好。但是go語言是個強型別語言,對格式要求極其嚴格而json格式雖然也有型別,但是並不穩定,go語言在解析 為非強型別語言時比如php等序列化的json...

golang json用法講解

下面看看乙個正常的結構體轉json是什麼樣子 package main import encoding json fmt product 商品資訊 type product struct func main p.name xiao mi 6 p.isonsale true p.number 1000...

Golang json用法詳解(一)

json格式可以算我們日常最常用的序列化格式之一了,go語言作為乙個由google開發,號稱網際網路的c語言的語言,自然也對json格式支援很好。但是go語言是個強型別語言,對格式要求極其嚴格而json格式雖然也有型別,但是並不穩定,go語言在解析 為非強型別語言時比如php等序列化的json時,經...