Go语言中的JSON处理:数据解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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通常包含嵌套对象。

博客

书籍推荐