Go语言中常见的JSON处理错误

1. 由嵌入式字段导致的非预期行为

在下面的例子中,我们创建一个Event结构体,其包含一个ID和一个嵌入式的时间戳:

type Event struct {
    ID int
    time.Time
}

由于 time.Time 是嵌入式的,因此我们可以直接通过Event来访问 time.Time 方法,比如event.Second( )。

嵌入式字段对JSON编码有哪些潜在影响呢?让我们通过下面这个例子寻找答案。我们将实例化一个 Event 并将其编码成JSON格式,这段代码的输出应该是什么呢?

event := Event{
    ID:   1234,
    Time: time.Now(),
}
 
b, err := json.Marshal(event)
if err != nil {
    return err
}
 
fmt.Println(string(b))

 我们可能期望这段代码能打印出类似下面的内容:

{"ID":1234,"Time":"2024-04-13T21:15:08.381652+02:00"}

实际上,打印结果是:

"2024-04-13T21:15:08.381652+02:00"

        如何解释这个输出呢?在ID字段和1234这个值上发生了什么?由于ID字段是导出类型的,它应该被编码。为了理解这个问题,我们必须强调以下这两点。

首先,如果一个嵌入式字段实现了一个接口,那么包含这个字段的结构体也将实现这个接口。

其次,我们可以通过让一个类型实现json.Marshaler接口来改变默认的编码行为。这个接口只包含一个MarshalJSON函数:

type Marshaler interface {
    MarshalJSON() ([]byte, error)
}

 这里有一个带自定义编码的例子:

type foo struct{}
 
func (foo) MarshalJSON() ([]byte, error) {
    retu

你可能感兴趣的:(Go语言开发,开发语言,后端,Go)