青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2017年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910


專注即時通訊及網游服務端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 220943
  • 排名 - 117

最新評論

閱讀排行榜

http://blog.csdn.net/tiaotiaoyly/article/details/38942311

Encode

將一個對象編碼成JSON數據,接受一個interface{}對象,返回[]byte和error:

func Marshal(v interface{}) ([]byte, error)

Marshal函數將會遞歸遍歷整個對象,依次按成員類型對這個對象進行編碼,類型轉換規則如下:

bool類型 轉換為JSON的Boolean
整數,浮點數等數值類型 轉換為JSON的Number
string 轉換為JSON的字符串(帶""引號)
struct 轉換為JSON的Object,再根據各個成員的類型遞歸打包
數組或切片 轉換為JSON的Array
[]byte 會先進行base64編碼然后轉換為JSON字符串
map 轉換為JSON的Object,key必須是string
interface{} 按照內部的實際類型進行轉換
nil 轉為JSON的null
channel,func等類型 會返回UnsupportedTypeError

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. type ColorGroup struct {  
  2.     ID     int  
  3.     Name   string  
  4.     Colors []string  
  5. }  
  6. group := ColorGroup{  
  7.     ID:     1,  
  8.     Name:   "Reds",  
  9.     Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},  
  10. }  
  11. b, err := json.Marshal(group)  
  12. if err != nil {  
  13.     fmt.Println("error:", err)  
  14. }  
  15. os.Stdout.Write(b)  
  16.   
  17. Output:  
  18. {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}  

Decode

將JSON數據解碼

func Unmarshal(data []byte, v interface{}) error

類型轉換規則和上面的規則類似

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. var jsonBlob = []byte(`[  
  2.     {"Name": "Platypus", "Order": "Monotremata"},  
  3.     {"Name": "Quoll",    "Order": "Dasyuromorphia"}  
  4. ]`)  
  5. type Animal struct {  
  6.     Name  string  
  7.     Order string  
  8. }  
  9. var animals []Animal  
  10. err := json.Unmarshal(jsonBlob, &animals)  
  11. if err != nil {  
  12.     fmt.Println("error:", err)  
  13. }  
  14. fmt.Printf("%+v", animals)  
  15.   
  16. Output:  
  17. [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]  

結構體

結構體必須是大寫字母開頭的成員才會被JSON處理到,小寫字母開頭的成員不會有影響。

Mashal時,結構體的成員變量名將會直接作為JSON Object的key打包成JSON;Unmashal時,會自動匹配對應的變量名進行賦值,大小寫不敏感。

Unmarshal時,如果JSON中有多余的字段,會被直接拋棄掉;如果JSON缺少某個字段,則直接忽略不對結構體中變量賦值,不會報錯。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. type Message struct {  
  2.     Name  string  
  3.     Body  string  
  4.     Time  int64  
  5.     inner string  
  6. }  
  7.   
  8. var m = Message{  
  9.     Name:  "Alice",  
  10.     Body:  "Hello",  
  11.     Time:  1294706395881547000,  
  12.     inner: "ok",  
  13. }  
  14. b := []byte(`{"nAmE":"Bob","Food":"Pickle", "inner":"changed"}`)  
  15.   
  16. err := json.Unmarshal(b, &m)  
  17. if err != nil {  
  18.     fmt.Printf(err.Error())  
  19.     return  
  20. }  
  21. fmt.Printf("%v", m)  
  22.   
  23. Output:  
  24. {Bob Hello 1294706395881547000 ok}  

StructTag

如果希望手動配置結構體的成員和JSON字段的對應關系,可以在定義結構體的時候給成員打標簽:

使用omitempty熟悉,如果該字段為nil或0值(數字0,字符串"",空數組[]等),則打包的JSON結果不會有這個字段。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. type Message struct {  
  2.     Name string `json:"msg_name"`       // 對應JSON的msg_name  
  3.     Body string `json:"body,omitempty"` // 如果為空置則忽略字段  
  4.     Time int64  `json:"-"`              // 直接忽略字段  
  5. }  
  6. var m = Message{  
  7.     Name: "Alice",  
  8.     Body: "",  
  9.     Time: 1294706395881547000,  
  10. }  
  11. data, err := json.Marshal(m)  
  12. if err != nil {  
  13.     fmt.Printf(err.Error())  
  14.     return  
  15. }  
  16. fmt.Println(string(data))  
  17.   
  18. Output:  
  19. {"msg_name":"Alice"}  

更靈活地使用JSON

使用json.RawMessage

json.RawMessage其實就是[]byte類型的重定義??梢赃M行強制類型轉換。

現在有這么一種場景,結構體中的其中一個字段的格式是未知的:

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. type Command struct {  
  2.     ID   int  
  3.     Cmd  string  
  4.     Args *json.RawMessage  
  5. }  

使用json.RawMessage的話,Args字段在Unmarshal時不會被解析,直接將字節數據賦值給Args。我們可以能先解包第一層的JSON數據,然后根據Cmd的值,再確定Args的具體類型進行第二次Unmarshal。

這里要注意的是,一定要使用指針類型*json.RawMessage,否則在Args會被認為是[]byte類型,在打包時會被打包成base64編碼的字符串。

使用interface{}

interface{}類型在Unmarshal時,會自動將JSON轉換為對應的數據類型:

JSON的boolean 轉換為bool
JSON的數值 轉換為float64
JSON的字符串 轉換為string
JSON的Array 轉換為[]interface{}
JSON的Object 轉換為map[string]interface{}
JSON的null 轉換為nil

需要注意的有兩個。一個是所有的JSON數值自動轉換為float64類型,使用時需要再手動轉換為需要的int,int64等類型。第二個是JSON的object自動轉換為map[string]interface{}類型,訪問時直接用JSON Object的字段名作為key進行訪問。再不知道JSON數據的格式時,可以使用interface{}。

自定義類型

如果希望自己定義對象的打包解包方式,可以實現以下的接口:

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. type Marshaler interface {  
  2.     MarshalJSON() ([]byte, error)  
  3. }  
  4. type Unmarshaler interface {  
  5.     UnmarshalJSON([]byte) error  
  6. }  

實現該接口的對象需要將自己的數據打包和解包。如果實現了該接口,json在打包解包時則會調用自定義的方法,不再對該對象進行其他處理。

posted on 2017-05-04 10:28 思月行云 閱讀(279) 評論(0)  編輯 收藏 引用 所屬分類: Golang
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲自拍偷拍色片视频| 亚洲欧洲在线视频| 欧美大片国产精品| 美国成人毛片| 欧美激情久久久| 欧美日韩视频在线观看一区二区三区| 蜜桃av一区二区三区| 欧美成年人视频网站| 欧美日韩亚洲一区二区| 国产精品一区二区女厕厕| 国内欧美视频一区二区| 亚洲级视频在线观看免费1级| 亚洲精品国产精品乱码不99| 亚洲在线观看视频| 免费成人性网站| 日韩一二在线观看| 久久精品91| 欧美日韩视频专区在线播放 | 欧美精品麻豆| 欧美特黄一区| 国产综合久久久久久鬼色| 亚洲视频999| 性做久久久久久久久| 欧美国产精品劲爆| 国产女主播一区二区三区| 亚洲国产精品va| 欧美一级日韩一级| 亚洲日韩成人| 亚洲摸下面视频| 欧美精品99| 亚洲成色www久久网站| 亚洲一本大道在线| 亚洲破处大片| 久久亚洲一区| 国产欧美精品在线播放| 99精品热视频只有精品10| 久久久久久久久久久久久久一区 | 欧美.www| 黑人一区二区| 欧美一区亚洲| 一本色道婷婷久久欧美| 欧美xart系列高清| 伊人成人在线| 久久久久久网| 欧美一区二区三区四区在线观看地址 | 亚洲丝袜av一区| 欧美精品成人91久久久久久久| 一区二区三区中文在线观看 | 亚洲精品护士| 欧美3dxxxxhd| 久久永久免费| 国产又爽又黄的激情精品视频| 亚洲午夜精品国产| 日韩一区二区精品在线观看| 欧美多人爱爱视频网站| 亚洲黄一区二区三区| 欧美xxx在线观看| 久久一区二区精品| 亚洲国产精品国自产拍av秋霞| 久久久国产午夜精品| 欧美在线观看网站| 樱桃成人精品视频在线播放| 久久亚洲春色中文字幕| 久久久蜜臀国产一区二区| 黄色成人免费网站| 欧美激情91| 欧美成人综合| 亚洲电影下载| 国产在线一区二区三区四区| 亚洲电影av| 亚洲第一中文字幕在线观看| 欧美成人免费小视频| 亚洲精品一二三| 99在线精品免费视频九九视| 欧美日韩国产高清视频| 亚洲一区二区在线观看视频| 亚洲性感美女99在线| 国产中文一区| 91久久精品久久国产性色也91| 欧美日韩在线播放| 久久国产精品色婷婷| 麻豆久久婷婷| 亚洲欧美区自拍先锋| 欧美一区二区高清| 91久久国产自产拍夜夜嗨| 夜夜爽www精品| 好吊一区二区三区| 亚洲三级电影在线观看| 国产精品一区二区三区久久 | 夜久久久久久| 亚洲欧美视频在线观看| 亚洲国产精品专区久久| 亚洲视频电影图片偷拍一区| 国产综合色在线视频区| 亚洲伦理在线观看| 国产一区久久| 亚洲麻豆国产自偷在线| 国产一区二区三区四区三区四| 亚洲韩日在线| 黄色国产精品| 亚洲综合国产激情另类一区| 亚洲国产另类久久久精品极度| 亚洲一区在线观看视频 | 亚洲欧洲综合另类在线| 亚洲影音一区| 99国产精品99久久久久久粉嫩| 亚洲一区二区影院| 亚洲精品一区二区网址| 久久久久久国产精品一区| 亚洲欧美乱综合| 欧美日韩999| 欧美大片免费| 激情欧美一区二区三区| 亚洲制服av| 亚洲夜晚福利在线观看| 欧美成人中文| 欧美不卡三区| 一区二区视频在线观看| 亚洲综合视频一区| 亚洲午夜久久久久久尤物 | 欧美在线一区二区| 午夜精品国产精品大乳美女| 欧美精品一区二区三区四区| 欧美ab在线视频| 伊人久久大香线蕉av超碰演员| 香蕉成人久久| 欧美一区二区三区在线播放| 欧美久久九九| 久久国产主播| 午夜亚洲福利| 欧美日韩一区二区三区在线| 欧美电影在线播放| 在线播放国产一区中文字幕剧情欧美| 亚洲夜晚福利在线观看| 一区二区三区精品视频| 欧美精品国产精品| 91久久黄色| 亚洲无吗在线| 国产精品嫩草影院一区二区| 在线午夜精品| 午夜在线精品| 国产精品一区二区三区乱码| 亚洲在线成人| 久久久精品午夜少妇| 狠狠色狠色综合曰曰| 久久久在线视频| 亚洲大片免费看| 亚洲视频观看| 国产精品一区二区久久国产| 亚久久调教视频| 奶水喷射视频一区| 日韩西西人体444www| 欧美午夜精品久久久久久孕妇 | 欧美不卡在线| 日韩天堂在线观看| 久久aⅴ国产紧身牛仔裤| 国产一区免费视频| 欧美电影免费观看| 亚洲自拍偷拍一区| 欧美国产精品人人做人人爱| 99日韩精品| 国产字幕视频一区二区| 欧美国产日韩一二三区| 国产精品99久久99久久久二8| 久久国产欧美日韩精品| 亚洲国产欧美一区| 国产精品入口尤物| 久久躁日日躁aaaaxxxx| 99精品欧美| 美女黄毛**国产精品啪啪| 日韩亚洲欧美精品| 国产视频在线观看一区二区三区| 狼狼综合久久久久综合网| 日韩午夜av电影| 老**午夜毛片一区二区三区| 99riav国产精品| 怡红院精品视频| 国产精品久久久久久亚洲毛片 | 欧美一二区视频| 亚洲国产精品成人综合色在线婷婷| 美女福利精品视频| 亚洲欧美不卡| 亚洲九九九在线观看| 国产午夜精品麻豆| 欧美日韩直播| 免费日本视频一区| 亚洲网站在线看| 亚洲国产日韩欧美在线99| 欧美一区二区性| 在线视频精品一区| 在线观看成人小视频| 91久久一区二区| 亚洲一二三区在线| 欧美激情亚洲自拍| 亚洲国产欧美日韩| 国产中文一区二区三区| 欧美日韩一区二区三| 欧美成人国产| 久久亚洲捆绑美女| 欧美在线日韩精品|