golang解析创建复杂嵌套的json数据

Golang的json序列化果真是静态语言的范呀。各种的麻烦,各种的标准。 用pyhon的时候毫无顾忌,各种的数据各种的塞。 各个功能模块需要传递信息,一般是需要序列化的,常用的序列化模式有json、msgpack啥的。

这里就先扯扯golang的json模块。 对于相当复杂又各种嵌套的json数据,应该如何解析成go内置的数据类型? 需要你写一堆的关联struct的。 

golang json里的struct变量首字母需要大写的,如果给你的json是小写咋办?在type后面跟着别名就可以了,格式是 `json:”字段名”` 。


该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。

http://xiaorui.cc/2016/03/06/golang%E8%A7%A3%E6%9E%90%E5%88%9B%E5%BB%BA%E5%A4%8D%E6%9D%82%E5%B5%8C%E5%A5%97%E7%9A%84json%E6%95%B0%E6%8D%AE/

我们先说说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.


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. PG 2016年7月14日 / 下午6:12

    js, err := simplejson.NewJson(body) => js, err := simplejson.NewJson([]byte(body))

发表评论

邮箱地址不会被公开。 必填项已用*标注