• <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
            <2016年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678


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

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 215702
            • 排名 - 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類型的重定義??梢赃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 思月行云 閱讀(250) 評論(0)  編輯 收藏 引用 所屬分類: Golang
            国产成人久久AV免费| 久久免费高清视频| 色欲av伊人久久大香线蕉影院| 精品一区二区久久久久久久网站| 久久天堂电影网| 中文字幕亚洲综合久久菠萝蜜| av午夜福利一片免费看久久| 国产精品gz久久久| 午夜精品久久久久久毛片| 久久久久亚洲AV成人网| 久久亚洲欧美国产精品| 亚洲国产精品综合久久一线| jizzjizz国产精品久久| 久久无码国产专区精品| 久久精品人人做人人爽电影| 精品久久亚洲中文无码| 久久AAAA片一区二区| 麻豆亚洲AV永久无码精品久久| 国内精品久久久久久麻豆| 久久狠狠高潮亚洲精品| 久久频这里精品99香蕉久| 伊人久久免费视频| 国产99精品久久| 亚洲AV无码久久精品色欲| 久久综合九色欧美综合狠狠| 亚洲国产精品久久久久网站 | 久久午夜福利电影| .精品久久久麻豆国产精品| 久久综合亚洲色一区二区三区| 久久99精品国产麻豆蜜芽| 久久久无码精品亚洲日韩蜜臀浪潮| 97久久精品人人澡人人爽| 99精品国产在热久久无毒不卡| 日韩一区二区三区视频久久| 久久99精品国产麻豆婷婷| 国産精品久久久久久久| 99久久精品免费看国产一区二区三区| 99久久婷婷国产综合亚洲| 精品久久777| 国产精品成人久久久久三级午夜电影| 亚洲国产精品久久久久婷婷软件|