痛點
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時,經...