Go解析json遇到了大數(shù)字、不定格式等特殊情況,在此做了一個整理。
創(chuàng)新互聯(lián)專業(yè)成都網站設計、成都網站制作,集網站策劃、網站設計、網站制作于一體,網站seo、網站優(yōu)化、網站營銷、軟文發(fā)布平臺等專業(yè)人才根據(jù)搜索規(guī)律編程設計,讓網站在運行后,在搜索中有好的表現(xiàn),專業(yè)設計制作為您帶來效益的網站!讓網站建設為您創(chuàng)造效益。
選擇哪個要視輸入而定。
json.Unmarshal 操作對象是一個 []byte ,也就意味著被處理的JSON要全部加載到內存。如果有一個加載完的JSON使用 json.Unmarshal 會快一些。
json.Decoder 操作的是一個 stream ,或者其他實現(xiàn)了 io.Reader 接口的類型。意味著可以在接收或傳輸?shù)耐瑫r對其進行解析。當處理一組較大數(shù)據(jù)時無需重新copy整個JSON到內存中。
最好的選擇辦法如下:
默認情況下,go對json解析過程中遇到的數(shù)字都會當做float64處理。如果數(shù)字過大會有精度丟失。可以使用json.Number來處理。
輸出結果:
使用 json.Decoder 只能操作 io.Reader 類型的JSON數(shù)據(jù)。
有時候遇到字段不定的JSON,需要一邊判斷一邊解析。如:
可以先統(tǒng)一解組到interface{} 然后判斷關鍵字段再進行后續(xù)處理。
結果
使用RawMessage便于分步Unmarshal
原文鏈接
json格式可以算我們日常最常用的序列化格式之一了,Go語言作為一個由Google開發(fā),號稱互聯(lián)網的C語言的語言,自然也對JSON格式支持很好。官方提供的Json解析包已經非常強大,我們接下來講解Json的序列化與反序列化操作。另外還有一些第三方的Json解析庫,也能夠高效的操作Json對象,比如simplejson,ffjson等。下面是兩個比較重要的函數(shù):
? Json Marshal:將數(shù)據(jù)編碼成json字符串
Marshal 用于將struct對象序列化到json對象中。v是interface{}類型,任何類型都實現(xiàn)了空接口。
1:tag中的第一個參數(shù)是用來指定別名,比如Name 指定別名為 username `json:"username"`
2:如果不想指定別名但是想指定其他參數(shù)用逗號來分隔,omitempty 指定到一個field時,如果在賦值時對該屬性未賦值或者對該屬性賦值為 zero value,那么將Person序列化成json時會忽略該字段
3:- 指定到一個field時,無論有沒有值,將Person序列化成json時都會忽略該字段
4:string 指定到一個field時,比如Person中的Count為int類型 如果沒有任何指定在序列化到json之后也是int 比如這個樣子 “Count”:0,但是如果指定了string之后序列化之后也是string類型的,那么就是這個樣子"Count":"0"
? struct序列化為Json
? slice序列化為Json
? map 序列化為Json
? Json Unmarshal:將json字符串解碼到相應的數(shù)據(jù)結構,Unmarshal的第一個參數(shù)是[]byte,第二個參數(shù)是接受json解析的數(shù)據(jù)結構。
下面我們依次講解Json的操作。
1:將Json序列化進入結構體
2::將Json序列化到結構體slice
3:將Json序列化進Map
4:將Json序列化進Slice
golang對json序列化和反序列化的操作實在是難受,所以說用習慣了高級語言特性,再轉到這些偏原生的寫法上就會很難受。
不多BB,開始記錄。
當寫個小demo或者做個小工具,沒有大規(guī)模使用場景,那使用哪個庫都是一樣的,因為性能的體現(xiàn)并不會很明顯。但是如果是在實際項目中使用,且伴隨著高并發(fā),大容量等場景,我還是推薦使用 json-iterator 。
號稱最快的go json解析器。跟官方的寫法兼容,我目前基本都使用這個。
效率對比
ns 納秒 op 操作
倆種方式,一種直接反序列化成 結構體數(shù)組,另一種反序列化為 slice,內容為map[string]interface{}
結構體數(shù)組
slice
完整的一條json語句中,字段都為字符串類型,值為基本數(shù)據(jù)類型:整形、布爾型、字符串等
在解析json時,通常要用到encoding/json這個包
json.Unmarshal()方法用作將一個json類型的字節(jié)流,序列化成指定的形式,可以為map,也可以為自定義的結構體,需要注意的是,希望被轉換的格式需要以指針類型傳入
運行結果如下
將map或者struct打包成json,用的是json中的marshal方法,返回的是一個字節(jié)數(shù)組和一個錯誤類型
打印結果
后端開發(fā)人員跟前端對接接口的時候,或多或少都會面臨一些溝通問題,比如說枚舉字符的定義,比如有整形狀態(tài)字段: state
通常給前端的時候,前段要做的是將1,2,3以及對應的中文釋義存儲為key/value的形式,key與value單看都無法知道對方的語義,
比如我只知道狀態(tài)值為“1”, 是無法將其與“成功”對應起來的(當然這套狀態(tài)的設計者肯定是知道的),后端通常給到前端的restful api
接口定義也是key/value的形式,這乍一看其實也沒啥毛病,只要有key/value也沒問題,后端定義通常會是
但數(shù)字的表現(xiàn)形式終歸是不不太明確的,如果對狀態(tài)的定義換成以下形式:
基本可以理解為中英文互譯了,理解起來也會更清晰一些不是,如果這么做的話,后端給到前端的響應字段狀態(tài)的類型就需要修改成字符器格式
后端還是要做一層字符串到整型的轉換,從目的來講,我們只是想返給前端的 state 字段是字符串而已,也就是在做json序列化的時候將整型與字符串做一層轉換,有更優(yōu)雅的做法如下所示
只需要做兩件事,自定義類型 MyState ,實現(xiàn) MarshalJSON 方法
只要類型實現(xiàn)了 MarshalJSON 方法,在json序列化時就會調用此方法,如此一來,我們就輕松實現(xiàn)了自定義json序列化,反序列化同樣如此
實現(xiàn)起來也很簡單
需要注意的是, UnmarshalJSON 方法操作過程需要給 receiver 也就是 u 賦值,所以必須是指針類型,同樣的,在實現(xiàn)
MarshalJSON 方法, receiver 的類型需要與結構體定義中的類型保持一致,否則自定義序列化會失敗
參考:
運行結果
struct能被轉換的字段都是首字母大寫的字段,但如果想要在json中使用小寫字母開頭的key,可以使用struct的tag來輔助反射。
運行結果:
測試代碼
運行結果
在這里插入圖片描述
標題名稱:go語言怎么用json 為什么用go語言
當前路徑:http://vcdvsql.cn/article18/hejhdp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站排名、做網站、網站導航、小程序開發(fā)、網站制作、軟件開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)