在golang中处理json数据最常用的方式是使用标准库encoding/json。1. 解析json字符串到结构体:定义与json结构对应的结构体,使用json.unmarshal进行解析,字段名需首字母大写,并可通过标签指定json字段名,omitempty可忽略空字段;2. 动态解析未知结构的json:使用map[string]interface{}或interface{}接收数据,灵活但需要手动类型断言;3. 将结构体转换为json字符串:通过json.marshal将结构体序列化为json字符串,使用json.marshalindent生成带缩进格式的json;4. 处理嵌套结构和数组:通过嵌套结构体映射复杂json结构,确保字段一一对应即可完成解析。掌握这些常见用法可满足大多数json处理需求。

在Golang中处理JSON数据,最常用的方式就是使用标准库中的encoding/json包。这个库功能齐全、性能稳定,几乎能满足所有常见的JSON解析与生成需求。下面我们就来看看它的几种常见用法。

1. 解析JSON字符串到结构体
这是最常见的操作之一。当你有一个已知结构的JSON字符串时,可以定义一个对应的结构体,然后使用json.Unmarshal来解析。

package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"` // omitempty 表示如果为空则忽略
}
func main() {
data := `{"name": "Alice", "age": 25}`
var user User
err := json.Unmarshal([]byte(data), &user)
if err != nil {
fmt.Println("解析失败:", err)
return
}
fmt.Printf("%+v\n", user)
}- 结构体字段名最好首字母大写,否则无法被正确赋值(非导出字段)
- 可以通过标签(tag)指定JSON字段名
- 使用
omitempty可以让某些字段在为空时不参与序列化
2. 动态解析未知结构的JSON
如果你不知道JSON的具体结构,或者它可能变化较大,可以用map[string]interface{}或interface{}来接收数据。
立即学习“go语言免费学习笔记(深入)”;
data := `{"name": "Bob", "hobbies": ["reading", "coding"]}`
var result map[string]interface{}
err := json.Unmarshal([]byte(data), &result)
if err != nil {
fmt.Println("解析失败:", err)
return
}
// 访问字段
name := result["name"].(string)
hobbies := result["hobbies"].([]interface{})
fmt.Println("Name:", name)
for _, h := range hobbies {
fmt.Println("Hobby:", h.(string))
}这种方式灵活但类型不安全,需要手动做类型断言。适用于处理API返回结构不确定的情况。

3. 将结构体转换为JSON字符串
除了解析,我们也经常要把Go结构体转成JSON字符串发送给前端或写入文件。
user := User{
Name: "Charlie",
Age: 30,
Email: "charlie@example.com",
}
jsonData, _ := json.Marshal(user)
fmt.Println(string(jsonData))
// 带缩进格式输出
prettyJsonData, _ := json.MarshalIndent(user, "", " ")
fmt.Println(string(prettyJsonData))-
json.Marshal会自动忽略空值字段(如零值int、空字符串等),除非你加了omitempty标签 - 使用
MarshalIndent可以生成带缩进的JSON,方便调试查看
4. 处理嵌套结构和数组
JSON中经常包含嵌套对象或数组,比如用户列表、地址信息等。我们可以通过嵌套结构体来处理。
type Address struct {
City string `json:"city"`
Zip string `json:"zip"`
}
type User struct {
Name string `json:"name"`
Addresses []Address `json:"addresses"`
}
data := `{
"name": "David",
"addresses": [
{"city": "Beijing", "zip": "100000"},
{"city": "Shanghai", "zip": "200000"}
]
}`
var user User
json.Unmarshal([]byte(data), &user)
fmt.Printf("%+v\n", user)这种写法能很好地映射复杂的JSON结构,只要结构体字段一一对应即可。
基本上就这些。掌握了这几个常见场景,就能应付大多数项目中的JSON处理任务了。虽然Go语言语法比较严格,但encoding/json库设计得非常清晰,熟悉之后效率很高。










