Golang的json序列化果真是静态语言的范呀。各种的麻烦,各种的标准。 用pyhon的时候毫无顾忌,各种的数据各种的塞。 各个功能模块需要传递信息,一般是需要序列化的,常用的序列化模式有json、msgpack啥的。
这里就先扯扯golang的json模块。 对于相当复杂又各种嵌套的json数据,应该如何解析成go内置的数据类型? 需要你写一堆的关联struct的。
golang json里的struct变量首字母需要大写的,如果给你的json是小写咋办?在type后面跟着别名就可以了,格式是 `json:”字段名”` 。
我们先说说golang json常规点的序列化及反序列化方法。
下面是序列化:
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 。
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是反序列化。
#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. 细点心就搞定.
# 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库来解析。
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)
}
end.