• <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
            <2018年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456


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

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 216742
            • 排名 - 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
            久久久久综合网久久| 久久国产一区二区| 久久久久香蕉视频| 国产精品无码久久四虎| 国产精品亚洲美女久久久| 国内精品久久久久久久影视麻豆| 久久久久久久久久免免费精品 | 欧美精品丝袜久久久中文字幕| 久久激情五月丁香伊人| 香蕉99久久国产综合精品宅男自 | 97精品久久天干天天天按摩| 免费观看成人久久网免费观看| 国产综合免费精品久久久| 综合久久一区二区三区 | 性做久久久久久久久| 精品国产青草久久久久福利| 久久99国产精品久久99| 久久综合亚洲色一区二区三区| 久久九九精品99国产精品| 看全色黄大色大片免费久久久| 久久国产色AV免费看| 无码人妻少妇久久中文字幕| 久久精品国产亚洲AV香蕉| 人人狠狠综合久久亚洲高清| 精品久久777| 久久99精品久久久久久久久久| 色偷偷88欧美精品久久久| 天天久久狠狠色综合| 久久国产精品无码一区二区三区 | 久久久久四虎国产精品| 亚洲AV日韩精品久久久久久| 久久99热这里只有精品国产 | 久久av高潮av无码av喷吹| 91精品国产91久久久久久蜜臀| 久久精品国产亚洲AV麻豆网站| 久久久久久亚洲精品影院| 久久久久久久久久久免费精品| 国产成人综合久久久久久| 久久综合狠狠综合久久激情 | 2020最新久久久视精品爱| 99久久国产热无码精品免费|