Go 语言面试题
目录

Go 语言中 encoding/json 包的用法?

· 约 6 分钟读完 · 第 110 / 175 章

推荐答案

在 Go 语言中,encoding/json 包用于处理 JSON 数据的编码和解码。它提供了将 Go 数据结构序列化为 JSON 字符串以及将 JSON 字符串反序列化为 Go 数据结构的功能。

编码(序列化)

使用 json.Marshal 函数可以将 Go 数据结构转换为 JSON 格式的字节切片。

解码(反序列化)

使用 json.Unmarshal 函数可以将 JSON 格式的字节切片解码为 Go 数据结构。

本题详细解读

1. 结构体标签

在 Go 语言中,结构体字段可以通过标签(tag)来指定 JSON 序列化和反序列化时的字段名称。例如:

在上面的例子中,Name 字段在 JSON 中对应的键是 "name",Age 字段对应的键是 "age"。

2. 编码(序列化)

json.Marshal 函数将 Go 数据结构转换为 JSON 格式的字节切片。如果结构体字段的值为零值(如 0、""、false 等),默认情况下这些字段会被忽略。可以通过 json:",omitempty" 标签来显式指定忽略零值字段。

3. 解码(反序列化)

json.Unmarshal 函数将 JSON 格式的字节切片解码为 Go 数据结构。如果 JSON 数据中的字段在 Go 结构体中不存在,这些字段会被忽略。如果 JSON 数据缺少某些字段,Go 结构体中的对应字段会保持其零值。

4. 处理嵌套结构

encoding/json 包也支持嵌套结构体的编码和解码。

5. 处理 JSON 数组

encoding/json 包还可以处理 JSON 数组。例如,可以将 JSON 数组解码为 Go 的切片。

6. 自定义编码和解码

通过实现 json.Marshaler 和 json.Unmarshaler 接口,可以自定义结构体的编码和解码行为。

7. 处理 JSON 中的空值

在 JSON 中,null 值可以通过 *string、*int 等指针类型来处理。如果 JSON 中的字段值为 null,Go 中的对应指针字段将为 nil。

8. 处理 JSON 中的未知字段

默认情况下,json.Unmarshal 会忽略 JSON 数据中未知的字段。可以通过使用 map[string]interface{} 来捕获这些未知字段。

9. 处理 JSON 中的特殊字符

encoding/json 包会自动处理 JSON 中的特殊字符,如引号、反斜杠等。在编码时,这些字符会被转义;在解码时,转义字符会被还原。

10. 性能优化

对于大型 JSON 数据,可以使用 json.Decoder 和 json.Encoder 来流式处理 JSON 数据,以减少内存占用。

通过以上内容,你可以全面了解 encoding/json 包在 Go 语言中的使用方法。