在 Go 语言中处理 JSON 数据时,通常会使用 encoding/json 标准库。以下是一些基本的操作和注意事项:
序列化(Marshaling)
将 Go 数据结构转换为 JSON 格式的字符串,可以使用 json.Marshal 或 json.MarshalIndent 函数。例如:
type Person struct {
Name string
Age int
}
func main() {
p := Person{"John Doe", 30}
jsonBytes, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(jsonBytes)) // 输出 JSON 字符串
}
反序列化(Unmarshaling)
将 JSON 格式的字符串转换为 Go 数据结构,可以使用 json.Unmarshal 函数。例如:
var jsonStr = `{"Name":"John Doe","Age":30}`
var p Person
err := json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", p) // 输出:{Name:John Doe Age:30}
注意事项
- 结构体字段必须首字母大写才能被
json包识别。 - 可以使用结构体标签来自定义 JSON 键名。
- 可以使用
omitempty来忽略空值字段。 - 指针字段在没有对应 JSON 数据时会被设置为
nil。 - JSON 编码时默认会转义 HTML 特殊字符,可以通过
SetEscapeHTML(false)禁用此行为。
高级用法
- 使用
json.Decoder和json.Encoder可以处理流式的 JSON 数据。 - 自定义类型可以实现
UnmarshalJSON和MarshalJSON方法来控制 JSON 的编解码过程。
性能考虑
如果对性能有较高要求,可以考虑使用第三方库,如 easyjson、ffjson 或 json-iterator/go,它们通过减少反射的使用来提高性能。
动态处理
如果 JSON 结构未知或需要动态处理,可以使用 map[string]interface{} 或 []interface{} 类型。
错误处理
在处理 JSON 数据时,应该注意检查 Marshal 和 Unmarshal 函数返回的错误。
这些是 Go 语言中处理 JSON 数据的基本方法和一些常见的注意事项。如果你有更具体的需求或遇到问题,可以提供更详细的信息。