亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang JSON的進階用法實例講解

2020-04-01 18:52:59
字體:
來源:轉載
供稿:網友

痛點

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

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

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

json: cannot unmarshal number into Go struct field Host.port of type string

你是否有json某字段兼容2種或者多種的數據結構的需求?

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

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

重現問題

我們給了用戶一個json如下:

{ "name":"yulibaozi", "port":8080}

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

json: cannot unmarshal number into Go struct field Host.port of type string

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

如何解決問題

我們先定義了一個結構體

type Host struct { Name string `json:"name"` Port Port `json:"port"`}

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

type Type intconst ( Int Type = iota String)type Port struct { Type Type IntVal int StrVal string}

在Port結構體中,我們發現了Type類型, 而Type類型包括了int,string兩種類型。接下來就非常重要了,我們需要實現以下這兩個接口。

json.Unmarshaller interfacejson.Marshaller interface

實現代碼如下:

type Port struct { Type Type IntVal int StrVal string}// 實現 json.Unmarshaller 接口func (port *Port) UnmarshalJSON(value []byte) error { if value[0] == '"' {  port.Type = String  return json.Unmarshal(value, &port.StrVal) } port.Type = Int return json.Unmarshal(value, &port.IntVal)}// 實現 json.Marshaller 接口func (port Port) MarshalJSON() ([]byte, error) { switch port.Type { case Int:  return json.Marshal(port.IntVal) case String:  return json.Marshal(port.StrVal) default:  return []byte{}, fmt.Errorf("impossible Port.Type") }}

接下來測試:

測試反解析

測試反解析int

給出json數據:

{"name":"yulibaozi","port":8090}

反解析得到的結構體數據如下:

&{Name:yulibaozi Port:{Type:0 IntVal:8090 StrVal:}}

測試反解析string:

給出json數據:

{"name":"yulibaozi","port":"8090"}

反解析得到的結構體數據如下:

&{Name:yulibaozi Port:{Type:1 IntVal:0 StrVal:8090}}

測試編碼的json

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

host := &Host{   Name: "yulibaozi",   Port: Port{     Type:  Int,     IntVal: 8080,   }, }

編碼后的json如下:

{"name":"yulibaozi","port":8080}

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

host := &Host{   Name: "yulibaozi",   Port: Port{     Type:  String,     StrVal: "8080",   }, }

編碼后的json數據如下:

{"name":"yulibaozi","port":"8080"}

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

在編碼測試中, 具體編碼那個數據是由Type來確定的。

總結

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久偷看各类女兵18女厕嘘嘘| 91精品国产91久久| 亚洲尤物视频网| 国产成人亚洲综合91| 高清欧美性猛交xxxx黑人猛交| 欧美日韩国产一区中文午夜| 美女福利视频一区| 久久久久久久一| 国产精品老女人视频| 久久久久久欧美| 不卡伊人av在线播放| 最近2019年好看中文字幕视频| 91久久精品日日躁夜夜躁国产| 国产精品久久久久久五月尺| 日韩中文综合网| 国产一区私人高清影院| 国产99视频在线观看| 成人激情综合网| 91中文在线视频| 精品久久久久久国产| 欧美性极品xxxx娇小| 亚洲国产精品成人一区二区| 日本一区二区三区四区视频| 亚洲精品福利资源站| 欧美日韩福利视频| 激情亚洲一区二区三区四区| 欧美性20hd另类| 福利一区视频在线观看| 国产精品欧美日韩一区二区| 国产精品一香蕉国产线看观看| 成人久久久久久久| 日韩精品电影网| 精品国产福利在线| 欧美一级电影免费在线观看| 国产成+人+综合+亚洲欧美丁香花| 这里只有精品久久| 亚洲国产欧美一区二区丝袜黑人| 欧美乱大交xxxxx另类电影| 情事1991在线| 亚洲一级一级97网| 久操成人在线视频| 欧美激情欧美激情在线五月| 久久久精品中文字幕| 成人黄色短视频在线观看| 亚洲综合在线中文字幕| 91在线高清视频| 欧美国产日韩中文字幕在线| 欧美在线激情视频| 亚洲成在人线av| 日韩av手机在线看| 久久人人爽亚洲精品天堂| 日韩欧美黄色动漫| 国产精品主播视频| 亚洲午夜色婷婷在线| 中文字幕国产精品久久| 成人在线视频网站| 日韩视频一区在线| 国产欧美久久一区二区| 激情成人在线视频| 亚洲另类图片色| 国产综合视频在线观看| www.美女亚洲精品| 精品一区二区亚洲| 91在线免费视频| 91国产精品91| 国产做受69高潮| 91免费国产视频| 91天堂在线观看| 久久精品这里热有精品| www.99久久热国产日韩欧美.com| 亚洲国产天堂网精品网站| 成人激情在线播放| 欧美成人激情在线| 亚洲乱码av中文一区二区| 国产精品情侣自拍| 日韩精品视频中文在线观看| 欧美最猛性xxxxx免费| 日韩欧美在线免费| 91极品视频在线| 欧美性videos高清精品| 欧美成人国产va精品日本一级| 97视频色精品| 亚洲综合自拍一区| 欧美日韩国产精品| 日本道色综合久久影院| 久久99久久久久久久噜噜| 国产精品自产拍在线观| 欧美超级乱淫片喷水| 日韩中文字幕国产精品| 国产精品人成电影在线观看| 久久精品国产99国产精品澳门| 自拍亚洲一区欧美另类| 欧美成人精品激情在线观看| 91老司机在线| 久久高清视频免费| 国产精品亚洲欧美导航| 亚洲开心激情网| 色婷婷综合久久久久| 日韩av123| 日韩三级影视基地| 亚洲国产日韩一区| 91精品久久久久久久久久久久久| 亚洲欧美精品suv| 国产日韩欧美夫妻视频在线观看| 国产成人亚洲综合青青| 亚洲美女性生活视频| 中文字幕不卡在线视频极品| 91wwwcom在线观看| 国产精品稀缺呦系列在线| 免费av在线一区| 欧美另类xxx| 国产亚洲精品美女久久久久| 日韩中文字幕在线免费观看| 亚洲缚视频在线观看| 欧美激情欧美激情| 成人中文字幕在线观看| 国产成人短视频| 国产精品久久久久久久久久东京| 最近日韩中文字幕中文| 自拍偷拍亚洲一区| 国产精品久久久久久久久久久久| 欧美性极品xxxx做受| 欧美大奶子在线| 欧美激情视频网| 一道本无吗dⅴd在线播放一区| 日韩精品视频在线观看网址| 国内精品一区二区三区四区| 亚洲日本中文字幕| 在线视频日本亚洲性| 欧美午夜精品伦理| 国产丝袜一区二区三区免费视频| 永久免费看mv网站入口亚洲| 久久久久久亚洲| 91精品国产一区| 国产精品丝袜久久久久久不卡| 国产精品日本精品| 亚洲影院色在线观看免费| 欧美日韩国产一区中文午夜| 亚洲欧美日韩精品久久奇米色影视| 海角国产乱辈乱精品视频| 日韩免费观看在线观看| 不卡毛片在线看| 亚洲精品国产免费| 国产免费观看久久黄| 色婷婷综合久久久久中文字幕1| 欧美精品免费在线| 欧美在线中文字幕| 亚洲а∨天堂久久精品9966| 精品五月天久久| 久久久久一本一区二区青青蜜月| 国产精品吊钟奶在线| 国产成人鲁鲁免费视频a| 热99久久精品| 原创国产精品91| 欧美大成色www永久网站婷| 国产亚洲精品久久久久久777| 国产精品久久久久影院日本| 91精品国产综合久久男男| 国产成人在线一区二区| 亚洲欧美日韩直播| 97色在线观看| 国产午夜精品视频免费不卡69堂| 欧美中文字幕第一页| 成人网在线免费看|