• <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>
            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

            搜索

            •  

            積分與排名

            • 積分 - 216745
            • 排名 - 118

            最新評論

            閱讀排行榜

            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類型的重定義。可以進行強制類型轉換。

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

            [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 思月行云 閱讀(254) 評論(0)  編輯 收藏 引用 所屬分類: Golang
            久久亚洲精品人成综合网| 久久人搡人人玩人妻精品首页 | 久久综合九色综合欧美狠狠| 狠狠色丁香久久婷婷综合| 狠狠色丁香婷婷综合久久来| 久久香蕉国产线看观看乱码| 色偷偷91久久综合噜噜噜噜| 浪潮AV色综合久久天堂| 亚洲综合精品香蕉久久网97| 久久久久久国产精品美女| 69国产成人综合久久精品| 手机看片久久高清国产日韩| 久久精品国产清高在天天线| 久久久久精品国产亚洲AV无码| 久久精品国产第一区二区三区 | 中文成人久久久久影院免费观看| 精品国产99久久久久久麻豆| 18岁日韩内射颜射午夜久久成人 | 久久精品国产精品青草app| 久久综合一区二区无码| 狠狠色丁香婷婷综合久久来 | 久久久国产精品福利免费| 人人妻久久人人澡人人爽人人精品| 九九99精品久久久久久| 久久久久久亚洲精品成人| 亚洲色欲久久久久综合网| 久久久久国产精品麻豆AR影院 | 亚洲国产成人精品女人久久久 | 国内精品久久人妻互换| 久久无码高潮喷水| 亚洲国产成人乱码精品女人久久久不卡| 久久噜噜电影你懂的| 国产精品久久一区二区三区| 久久久噜噜噜www成人网| 久久午夜无码鲁丝片秋霞| 青青草原综合久久大伊人| 国产精品一区二区久久精品涩爱 | 亚洲中文精品久久久久久不卡 | 国产精品美女久久久网AV| 国产L精品国产亚洲区久久| 国产亚州精品女人久久久久久 |