Golang如何实现JSON处理 解析marshal与unmarshal的用法

Golang如何实现JSON处理 解析marshal与unmarshal的用法
最新回答
玩贴吧的好菇凉

2023-02-20 02:04:14

在 Golang 中,处理 JSON 数据主要通过 encoding/json 包中的 json.Marshal 和 json.Unmarshal 实现,分别用于序列化(结构体转 JSON 字符串)和反序列化(JSON 字符串转结构体)。以下是具体用法和注意事项:

1. 使用 json.Marshal 将结构体转为 JSON 字符串

json.Marshal 用于将 Go 的结构体、切片、Map 等数据结构转换为 JSON 格式字符串。

基本用法示例

type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` // omitempty 表示空值不输出}func main() { user := User{ Name: "Alice", Age: 25, } data, _ := json.Marshal(user) fmt.Println(string(data)) // 输出: {"name":"Alice","age":25}}

注意事项

  • 字段导出性:结构体字段必须首字母大写(导出),否则无法序列化。
  • 标签控制:通过 json:"字段名" 标签自定义 JSON 键名。
  • 空值处理:使用 omitempty 标签可忽略空值字段(如 Email 为空时不会出现在 JSON 中)。

2. 使用 json.Unmarshal 将 JSON 字符串转为结构体

json.Unmarshal 用于将 JSON 字符串解析为 Go 结构体变量。

基本用法示例

jsonStr := `{"name":"Bob","age":30,"email":"bob@example.com"}`var user Usererr := json.Unmarshal([]byte(jsonStr), &user) // 必须传入指针if err != nil { log.Fatal(err)}fmt.Printf("%+vn", user) // 输出: {Name:Bob Age:30 Email:bob@example.com}

注意事项

  • 指针类型:解析目标必须是指针,否则无法修改原始变量。
  • 字段忽略:JSON 中存在但结构体中未定义的字段会被自动忽略。
  • 标签匹配:通过结构体标签(如 json:"name")匹配 JSON 键名。
3. 嵌套结构与 Map 处理灵活场景嵌套结构

支持多层嵌套的结构体,直接映射 JSON 的嵌套对象。

示例

type Address struct { City string `json:"city"` Zip string `json:"zip"`}type User struct { Name string `json:"name"` Address Address `json:"address"`}jsonStr := `{"name":"Charlie","address":{"city":"Shanghai","zip":"200000"}}`var user Userjson.Unmarshal([]byte(jsonStr), &user)使用 Map 处理动态结构

当 JSON 结构不确定或动态变化时,可用 map[string]interface{} 解析。

示例

var data map[string]interface{}jsonStr := `{"name":"Charlie","address":{"city":"Shanghai","zip":"200000"}}`json.Unmarshal([]byte(jsonStr), &data)fmt.Println(data["name"]) // 输出: Charliefmt.Println(data["address"]) // 输出: map[city:Shanghai zip:200000]

适用场景

  • JSON 结构未知或可能变化。
  • 需要动态访问字段时(如解析第三方 API 返回的 JSON)。
总结
  • 序列化:用 json.Marshal 将结构体转为 JSON 字符串,注意字段导出性、标签控制和 omitempty。
  • 反序列化:用 json.Unmarshal 将 JSON 字符串转为结构体,需传入指针,忽略多余字段,支持标签匹配。
  • 灵活性:通过嵌套结构或 map[string]interface{} 处理复杂或动态 JSON 数据。

掌握这些方法后,可覆盖大多数 JSON 处理场景,但需注意字段命名、嵌套结构和类型匹配的边界情况,建议通过单元测试验证。