JSON

上一节我们介绍了 xml 的使用,其实对于数据的序列化和反序列化还有一种更为常见的方式,那就是 JSON,尤其是在 http, rpc 的微服务调用中。

基础语法

在 Go 中我们主要使用官方的 encoding/json 包对 JSON 数据进行序列化和反序列化,主要使用方法有:

  • 序列化:

    func Marshal(v interface{}) ([]byte, error)
  • 反序列化:

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

简单例子:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var (
        data  = `1`
        value int
    )

    err1 := json.Unmarshal([]byte(data), &value)

    fmt.Println("Unmarshal error is:", err1)
    fmt.Printf("Unmarshal value is: %T, %d \n", value, value)

    value2, err2 := json.Marshal(value)

    fmt.Println("Marshal error is:", err2)
    fmt.Printf("Marshal value is: %s \n", string(value2))
}

当我们运行代码的时候可以得到如下输出结果:

在这个例子中,我们使用 UnmarshalMarshal 将一个整数的 JSON 二进制转化为 go int 数据。

注意:在实际应用中,我们在序列化和反序列化的时候,需要检查函数返回的 err, 如果 err 不为空,表示数据转化失败。

例如:我们把上面例子中 value 类型由 int 修改为 string 后再次运行代码,你将得到 Unmarshal error is: json: cannot unmarshal number into Go value of type string 的错误提醒。

数据对应关系

JSON 和 Go 数据类型对照表:

类型

JSON

Go

bool

true, false

true, false

string

"a"

string("a")

整数

1

int(1), int32(1), int64(1) ...

浮点数

3.14

float32(3.14), float64(3.14) ...

数组

[1,2]

[2]int{1,2}, []int{1, 2}

对象 Object

{"a": "b"}

map[string]string, struct

未知类型

...

interface{}

例如:

运行代码我们可以得到如下输出结果:

自定义数据类型

除了使用上面基础数据外,对于那些比较复杂的数据集合(Object),我们还可以使用自定义数据类型 struct 来转化。

  • Go 中关于 JSON 转化字段名的对应语法为:

  • 如果我们想忽略那些空值的字段,我们可以使用 omitempty 选项:

  • 如果我们想忽略特定字段:

组合示例:

实际例子练习

假如我们有这样一段 JSON 数据,它表示一个学生的考试成绩,下面我们就来看看在 Go 中如何序列化和反序列化。

  • 数据准备:

  • 反序列化:

运行代码输出结果为:

  • 序列化:

当我们运行代码后,打开 data2.json 文件,将看到如下内容:

最后更新于

这有帮助吗?