Golang笔记 6.2 JSON 处理 - Go语言中文社区

Golang笔记 6.2 JSON 处理


前言

我正在学习酷酷的 Golang,可点此查看帖子Golang学习笔记汇总

1 库的介绍

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

2 编码为JSON格式

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

func Marshal(v interface{}) ([]byte, error)

示例

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格式的文本:

b, err := json.Marshal(gobook)

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

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()函数的原型如下:

func Unmarshal(data []byte, v interface{}) error

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

示例

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

var book Book

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

err := json.Unmarshal(b, &book)

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


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() 两个函数来便于具体实现:

func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.Writer) *Encoder

示例

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

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


版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/iotisan/article/details/103086659
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢