Golang中如何自定义JSON编码?

7 min read

在Golang中,可以通过实现Marshaler和Unmarshaler接口来自定义JSON编码和解码过程。

例如,假设我们有一个Person结构体,其中包含姓名、年龄和性别属性:

type Person struct {
    Name   string
    Age    int
    Gender string
}

默认情况下,将使用Golang的默认JSON编码方式将此结构体转换为JSON格式。

但是,如果我们想自定义JSON编码,可以通过实现Marshaler接口来实现:

func (p Person) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        NameWithGender string `json:"name"`
        Age            int    `json:"age"`
    }{
        NameWithGender: p.Name + " (" + p.Gender + ")",
        Age:            p.Age,
    })
}

在这个例子中,我们将姓名和性别组成一个新的字段,并将其命名为“name”。

另外,我们还可以通过实现Unmarshaler接口来自定义JSON解码出来的结构体的格式。

例如,如果我们在解码JSON时期望姓名和性别是通过一个“/”分隔的字符串而非两个单独的字段,我们可以这样来实现:

func (p *Person) UnmarshalJSON(data []byte) error {
    var tmp struct {
        NameWithGender string `json:"name"`
        Age            int    `json:"age"`
    }

    if err := json.Unmarshal(data, &tmp); err != nil {
        return err
    }

    parts := strings.Split(tmp.NameWithGender, "/")

    if len(parts) != 2 {
        return errors.New("invalid name/gender format")
    }

    p.Name, p.Gender, p.Age = parts[0], parts[1], tmp.Age

    return nil
}

通过实现这两个接口,我们可以灵活地控制和定制JSON编码和解码过程。