Golang的json序列化果真是静态语言的范呀。各种的麻烦,各种的标准。 用pyhon的时候毫无顾忌,各种的数据各种的塞。 各个功能模块需要传递信息,一般是需要序列化的,常用的序列化模式有json、msgpack啥的。
这里就先扯扯golang的json模块。 对于相当复杂又各种嵌套的json数据,应该如何解析成go内置的数据类型? 需要你写一堆的关联struct的。
golang json里的struct变量首字母需要大写的,如果给你的json是小写咋办?在type后面跟着别名就可以了,格式是 json:"字段名"
。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。
我们先说说golang json常规点的序列化及反序列化方法。
下面是序列化:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
type Detail struct { Time string `json:"time"` Url string `json:"url"` } var detail Detail detail.Time = "2014" detail.Url = "xiaorui.cc" body, err := json.Marshal(detail) if err != nil { panic(err.Error()) } |
下面是反序列化的方法,这里我们介绍一个超级简单的反序列化模块 。simplejson ! 一个高度封装的json库,你不需要针对嵌套的json写各种interface及struct 。 这个库我也是事后才知道的。
go-simplejson的import的github地址是,github.com/bitly/go-simplejson 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package main import ( "fmt" "github.com/bitly/go-simplejson" ) func main() { body := `{ "version": { "max": 3, "last": "2016-03-11", "detail": [ { "time": "2016-03-12", "ops": "add my email" } ] } } ` js, err := simplejson.NewJson(body) //反序列化 if err != nil { panic(err.Error()) } } |
提醒一下,Marshal是序列化方法, Unmarshal是反序列化。
1 2 3 4 5 6 7 |
#xiaorui.cc var s = make(map[string]interface{}) s["userid"] = "xiaorui.cc" s["time"] = "xxx" result, _ := json.Marshal(s) fmt.Print(string(result)) //需要string() |
在调试的过程中会遇到下面的bug. 细点心就搞定.
1 2 3 4 5 |
# command-line-arguments ./j.go:73: r.Article[0].Version.Detail.Ops undefined (type []Detail has no field or method Ops) exit status 2 |
呵,为了解析嵌套的json,写了一堆的struct结构,这实现的方法比较伤。但当你使用这些结构来构造json数据时还算方便。 如果不想使用encoding/json,可以上使用simplejson库来解析。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
package main // xiaorui.cc import "fmt" import "encoding/json" type Detail struct { Time string `json:"time"` Ops string `json:"ops"` } type Version struct { Last string `json:"last"` Max int `json:"max"` Detail []Detail `json:"detail"` } type Desc struct { Date string `json:"date"` Content string `json:"content"` Brief string `json:"brief"` Keyword string `json:"keyword"` Version Version `json:"version"` } type Response struct { Url string `json:"url"` Title string `json:"title"` Email string `json:"email"` Admin string `json:"admin"` Address []string `json:"address"` Article []Desc `json:"article"` } func main() { body := ` { "url": "http://xiaorui.cc", "title": "golang and python", "admin": "fengyun", "email": "rfyiamcool@163.com", "address": [ "beijing", "qingdao" ], "article": [ { "date": "2014", "content": "golang json push to redis server", "brief": "golang json", "keyword": "json", "version": { "max": 3, "last": "2016-03-11", "detail": [ { "time": "2016-03-12", "ops": "add my email" } ] } } ] } ` var r Response err := json.Unmarshal([]byte(body), &r) if err != nil { fmt.Printf("err was %v", err) } fmt.Println(r.Article[0].Version.Max) fmt.Println(r.Article[0].Version.Detail[0].Ops) } |
有疑问加站长微信联系(非本文作者)