前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang笔记 6.2 JSON 处理

Golang笔记 6.2 JSON 处理

作者头像
twowinter
发布2020-04-17 11:36:59
5920
发布2020-04-17 11:36:59
举报
文章被收录于专栏:twowintertwowinter

1 库的介绍

Go语言内建对 JSON 的支持。使用Go语言内置的 encoding/json 标准库,开发者可以轻松使用Go程序生成和解析JSON格式的数据。

2 编码为JSON格式

使用json.Marshal()函数可以对一组数据进行JSON格式的编码。 json.Marshal()函数的声明如下:

代码语言:javascript
复制
func Marshal(v interface{}) ([]byte, error)

示例

代码语言:javascript
复制
type Book struct {
    Title string
    Authors []string
    Publisher string
    IsPublished bool
    Price float
}

gobook := Book{
    "Go语言编程",
    ["XuShiwei", "HughLv", "Pandaman", "GuaguaSong", "HanTuo", "BertYuan", "XuDaoli"],
    "ituring.com.cn",
    true,
    9.99
}

然后,我们可以使用 json.Marshal() 函数将gobook实例生成一段JSON格式的文本:

代码语言:javascript
复制
b, err := json.Marshal(gobook)

如果编码成功, err 将赋于零值 nil,变量b 将会是一个进行JSON格式化之后的[]byte类型:

代码语言:javascript
复制
b == []byte(`{
    "Title": "Go语言编程",
    "Authors": ["XuShiwei", "HughLv", "Pandaman", "GuaguaSong", "HanTuo", "BertYuan",
    "XuDaoli"],
    "Publisher": "ituring.com.cn",
    "IsPublished": true,
    "Price": 9.99
}`)

3 解码JSON数据

可以使用json.Unmarshal()函数将JSON格式的文本解码为Go里边预期的数据结构。 json.Unmarshal()函数的原型如下:

代码语言:javascript
复制
func Unmarshal(data []byte, v interface{}) error

该函数的第一个参数是输入,即JSON格式的文本(比特序列),第二个参数表示目标输出容器,用于存放解码后的值。

示例

要解码一段JSON数据,首先需要在Go中创建一个目标类型的实例对象,用于存放解码后的值:

代码语言:javascript
复制
var book Book

然后调用 json.Unmarshal() 函数,将 []byte 类型的JSON数据作为第一个参数传入,将 book 实例变量的指针作为第二个参数传入:

代码语言:javascript
复制
err := json.Unmarshal(b, &book)

如果 b 是一个有效的JSON数据并能和 book 结构对应起来,那么JSON解码后的值将会一一存放到book结构体中。解码成功后的 book 数据如下:

代码语言:javascript
复制
book := Book{
    "Go语言编程",
    ["XuShiwei", "HughLv", "Pandaman", "GuaguaSong", "HanTuo", "BertYuan", "XuDaoli"],
    "ituring.com.cn",
    true,
    9.99
}

4 JSON的流式读写

Go 内建的 encoding/json 包还提供 Decoder 和 Encoder 两个类型,用于支持 JSON 数据的流式读写,并提供 NewDecoder() 和 NewEncoder() 两个函数来便于具体实现:

代码语言:javascript
复制
func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.Writer) *Encoder

示例

从标准输入流中读取JSON数据,然后将其解码,但只保留Title字段(书名),再写入到标准输出流中。

代码语言:javascript
复制
func main() {
    dec := json.NewDecoder(os.Stdin)
    enc := json.NewEncoder(os.Stdout)
    for {
        var v map[string]interface{}
        if err := dec.Decode(&v); err != nil {
            log.Println(err)
            return
        }
        for k := range v {
            if k != "Title" {
                v[k] = nil, false
            }
        }
        if err := enc.Encode(&v); err != nil {
            log.Println(err)
        }
    }
}

使用 Decoder 和 Encoder 对数据流进行处理可以应用得更为广泛些,比如读写 HTTP 连接、WebSocket或文件等。

5 小结

encoding/json 标准库除了使用 Marshal()、Unmarshal() 进行 json 编解码之外,还支持使用 Decoder 和 Encoder 进行流式读写。

END

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 库的介绍
  • 2 编码为JSON格式
    • 示例
    • 3 解码JSON数据
      • 示例
      • 4 JSON的流式读写
        • 示例
        • 5 小结
        • END
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档