Go 语言中 JSON 处理的入门指南
JSON(JavaScript对象表示法)是现代Web应用、微服务和API中最流行的数据交换格式之一。Go语言(Golang)通过encoding/json包提供了内置的JSON处理支持,让您能够轻松实现Go数据结构与JSON字符串之间的相互转换。
本文将深入探讨如何在Go中执行JSON的解析(反序列化)和序列化操作。您将学习如何处理简单和嵌套结构、错误处理以及字段名称的配置。无论您是初学者还是希望系统化知识的经验开发者,本文都会对您有所帮助。
Go 中序列化(Marshal)基础
将 Go 结构体转换为 JSON
序列化是将Go对象(如结构体或切片)转换为JSON字符串的过程。我们使用json.Marshal()函数。来看一个简单的例子:
package main
import ( "encoding/json" "fmt")
type User struct { Name string Age int Email string}
func main() { user := User{ Name: "Ivan Petrov", Age: 30, Email: "ivan@example.com", }
jsonData, err := json.Marshal(user) if err != nil { fmt.Println("Serialization error:", err) return }
fmt.Println(string(jsonData))}程序输出:
{"Name":"Ivan Petrov","Age":30,"Email":"ivan@example.com"}注意:JSON中的字段名称与结构体的字段名称一致。但通常需要修改字段名,例如使用camelCase风格。为此,我们使用结构体标签。
使用标签配置 JSON
结构体标签允许您指定字段的序列化方式。为示例添加标签:
type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"`}现在输出将变为:
{"name":"Ivan Petrov","age":30,"email":"ivan@example.com"}关键标签选项:
json:"field_name"— 设置JSON中的字段名称。omitempty— 如果字段具有零值(空字符串、0、false、nil),则从JSON中排除该字段。-— 在序列化/反序列化过程中完全忽略该字段。
切片和映射的序列化
encoding/json包不仅适用于结构体,也适用于切片、映射和简单类型:
// 结构体切片users := []User{ {Name: "Anna", Age: 25}, {Name: "Boris", Age: 35},}jsonUsers, _ := json.Marshal(users)fmt.Println(string(jsonUsers))// 输出: [{"name":"Anna","age":25},{"name":"Boris","age":35}]
// 映射data := map[string]interface{}{ "status": "ok", "count": 42,}jsonMap, _ := json.Marshal(data)fmt.Println(string(jsonMap))// 输出: {"count":42,"status":"ok"}Go 中的 JSON 解析(Unmarshal)
基本解析到结构体
反序列化(解析)是反向过程:将JSON字符串转换为Go对象。使用json.Unmarshal()函数。注意:目标结构体必须是可导出的(字段以大写字母开头)或具有适当的标签。
jsonString := `{"name":"Maria","age":28,"email":"maria@example.com"}`
var user Usererr := json.Unmarshal([]byte(jsonString), &user)if err != nil { fmt.Println("Parsing error:", err) return}
fmt.Printf("Name: %s, Age: %d", user.Name, user.Age)// 输出: Name: Maria, Age: 28解析嵌套结构体
JSON通常包含嵌套对象。