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

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2025年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678


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

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 219947
  • 排名 - 118

最新評論

閱讀排行榜

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

Encode

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

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

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

bool類型 轉換為JSON的Boolean
整數(shù),浮點數(shù)等數(shù)值類型 轉換為JSON的Number
string 轉換為JSON的字符串(帶""引號)
struct 轉換為JSON的Object,再根據(jù)各個成員的類型遞歸打包
數(shù)組或切片 轉換為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數(shù)據(jù)解碼

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

類型轉換規(guī)則和上面的規(guī)則類似

[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值(數(shù)字0,字符串"",空數(shù)組[]等),則打包的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類型的重定義。可以進行強制類型轉換。

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

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

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

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

使用interface{}

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

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

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

自定義類型

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

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

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

posted on 2017-05-04 10:28 思月行云 閱讀(273) 評論(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>
            亚洲韩国青草视频| 亚洲精品久久久蜜桃| 夜夜狂射影院欧美极品| 欧美国产91| 欧美片在线播放| 亚洲一区一卡| 欧美一区网站| 亚洲国产日本| 日韩天堂av| 国产一区二区三区直播精品电影 | 亚洲电影免费观看高清完整版在线观看 | 亚洲天堂久久| 好看不卡的中文字幕| 欧美高清在线视频| 欧美日韩日日夜夜| 欧美在线网站| 欧美r片在线| 亚洲欧美日韩国产中文在线| 欧美一区二区成人| 亚洲精品乱码久久久久久| 亚洲午夜一二三区视频| 激情另类综合| 一区二区国产日产| 韩国精品在线观看| 亚洲免费精彩视频| 韩日欧美一区| 艳妇臀荡乳欲伦亚洲一区| 含羞草久久爱69一区| 一本久久知道综合久久| 一区二区三区在线观看欧美| 日韩亚洲一区在线播放| 国模精品一区二区三区色天香| 欧美国产精品va在线观看| 国产精品青草久久| 欧美激情国产精品| 国产一区深夜福利| 99re热这里只有精品免费视频| 极品尤物av久久免费看| 一区二区三区四区国产精品| 亚洲国产成人久久综合| 欧美在线免费视频| 亚洲影视中文字幕| 欧美国内亚洲| 欧美成人国产一区二区| 国产精品尤物| 亚洲综合不卡| 欧美黄色视屏| 欧美激情在线免费观看| 亚洲欧美日韩国产| 男男成人高潮片免费网站| 久久久久久高潮国产精品视| 欧美日韩妖精视频| 亚洲欧洲一区二区三区久久| 一区二区在线观看视频在线观看| 香蕉久久夜色精品国产使用方法| 亚洲午夜精品网| 欧美日韩hd| 最新国产の精品合集bt伙计| 亚洲国产天堂久久综合网| 久久久久久电影| 久久久久综合| 国内精品久久久久影院薰衣草| 亚洲一区高清| 久久aⅴ国产紧身牛仔裤| 国产精品久久久久久五月尺| 中文高清一区| 亚洲欧美中日韩| 国产精品国产a| 亚洲一区欧美| 久久国产99| 一区二区三区在线视频播放| 久久精品国产2020观看福利| 免费成人在线视频网站| 亚洲二区在线观看| 欧美激情aaaa| 在线视频亚洲一区| 欧美一区二区三区在线观看视频| 国产精品婷婷| 欧美一区在线直播| 欧美大片专区| 亚洲视频1区2区| 国产精品男女猛烈高潮激情| 午夜视频在线观看一区二区三区 | 一本一本大道香蕉久在线精品| 欧美精品一区二区三| 宅男在线国产精品| 久久永久免费| 日韩性生活视频| 国产精品午夜视频| 久久裸体艺术| 夜夜夜久久久| 免费欧美在线视频| 一区二区电影免费观看| 国产精品主播| 女人色偷偷aa久久天堂| 亚洲一区尤物| 亚洲国产一区二区三区高清| 亚洲欧美99| 亚洲国产精品va| 国产精品一区毛片| 你懂的网址国产 欧美| 亚洲一区二区av电影| 免费在线看一区| 欧美一区91| 亚洲美洲欧洲综合国产一区| 国产精自产拍久久久久久| 农村妇女精品| 久久国产精品久久w女人spa| 亚洲人成绝费网站色www| 久久精品欧美日韩| 国产伦精品一区二区三区在线观看 | 一本色道88久久加勒比精品| 国产精品专区第二| 欧美激情精品久久久久久黑人| 亚洲综合成人婷婷小说| 91久久久久久久久| 美女图片一区二区| 欧美自拍偷拍| 亚洲欧美999| 亚洲色图在线视频| 亚洲精品久久久久| 国内精品嫩模av私拍在线观看| 欧美日韩亚洲一区三区| 女人天堂亚洲aⅴ在线观看| 午夜久久影院| 亚洲欧美国产精品va在线观看| 91久久夜色精品国产九色| 久久艳片www.17c.com| 欧美一级黄色录像| 亚洲欧美美女| 亚洲一区二区久久| 一区二区三区视频观看| 最新日韩欧美| 亚洲欧洲一区| 亚洲精品美女| 亚洲免费av观看| 亚洲精品一区二区三区樱花| 一区久久精品| 在线观看日韩| 亚洲国产毛片完整版 | 欧美日韩一区二| 欧美精品一区二区三区很污很色的 | 香港久久久电影| 性做久久久久久| 久久精品国产v日韩v亚洲| 欧美一区二区三区四区在线观看| 亚洲永久免费视频| 午夜精品国产精品大乳美女| 亚洲欧美另类在线观看| 午夜精品福利视频| 久久精品一区| 免费不卡中文字幕视频| 欧美成年视频| 欧美精品色一区二区三区| 欧美伦理在线观看| 欧美性大战久久久久久久| 国产精品第13页| 国产日韩在线视频| 一区二区三区在线视频免费观看| 亚洲高清av| 99在线精品视频| 亚洲免费影院| 久久精品视频99| 欧美好骚综合网| 亚洲免费久久| 先锋a资源在线看亚洲| 久热精品在线视频| 欧美日韩国产一中文字不卡| 国产精品久久久久久久久久三级 | 国产一区二区主播在线| 亚洲国产综合在线| 亚洲一区二区三区免费观看| 欧美在线一二三| 欧美激情一区二区三区高清视频 | 国产精品素人视频| 激情视频一区| 99亚洲视频| 久久国产99| 亚洲人成绝费网站色www| 午夜视频精品| 欧美日韩国产色综合一二三四| 国产精品日韩欧美综合| 亚洲第一精品夜夜躁人人爽 | 亚洲自拍偷拍麻豆| 美女亚洲精品| 亚洲欧美日本日韩| 欧美激情导航| 国内久久精品| 午夜一区不卡| 亚洲美女毛片| 久久久综合香蕉尹人综合网| 欧美日韩亚洲一区二区三区在线 | 国产精品国产三级国产| **欧美日韩vr在线| 欧美在线观看视频一区二区三区| 欧美激情bt| 久久国产精品一区二区三区| 欧美视频在线观看免费| 最新高清无码专区| 欧美xxx成人|