GO的第七天,JSON

Mr_J · · 557 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近比较忙,一直没有时间。最近的开发过程也遇到一些问题,之后会慢慢记录下来。团队开发当中也遇到一些让人心烦的事,不说废话了,先开始今天的话题吧。json是一种用于发送和接收结构化信息的标准协议。现在基本上API传输格式都是json,而且json数据格式相对好处理。

JSON

go语言中将 结构体 转为 json 的过程叫编组(marshaling)。编组通过调用 json.Marshal 函数完成。

type Movie struct {
    Title  string
    Year   int  `json:"released"`
    Color  bool `json:"color,omitempty"`
    Actors []string
}

var movies = []Movie{
    {Title: "Casablanca", Year: 1942, Color: false,
        Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
    {Title: "Cool Hand Luke", Year: 1967, Color: true,
        Actors: []string{"Paul Newman"}},
    {Title: "Bullitt", Year: 1968, Color: true,
        Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
    // ...
}

data, err := json.Marshal(movies, "", "    ")
if err != nil {
    log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", data)

上面的代码输出

[
    {
        "Title": "Casablanca",
        "released": 1942,
        "Actors": [
            "Humphrey Bogart",
            "Ingrid Bergman"
        ]
    },
    {
        "Title": "Cool Hand Luke",
        "released": 1967,
        "color": true,
        "Actors": [
            "Paul Newman"
        ]
    },
    {
        "Title": "Bullitt",
        "released": 1968,
        "color": true,
        "Actors": [
            "Steve McQueen",
            "Jacqueline Bisset"
        ]
    }
]

这里我们可以看出,结构体中的Year成员对应json结构中的released,Color对应color。omitempty,表示当Go语言结构体成员为空或零值时不生成JSON对象(这里false为零值)。

通过示例,我们知道了怎么去构造json结构的数据了。那么,json结构的数据,我们怎么解析呢。

var titles []struct{ Title string }
if err := json.Unmarshal(data, &titles); err != nil {
    log.Fatalf("JSON unmarshaling failed: %s", err)
}
fmt.Println(titles) // "[{Casablanca} {Cool Hand Luke} {Bullitt}]"

将JSON数据解码为Go语言的数据结构,Go语言中一般叫解码(unmarshaling),通过 json.Unmarshal 函数完成。
上面的代码将JSON格式的电影数据解码为一个结构体slice,结构体中只有Title成员。

通过上面两个编码个解码的示例,我们对go语言中json的基本使用已经有个大概的了解了。

参考

《GO语言圣经》


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:Mr_J

查看原文:GO的第七天,JSON

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

557 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传