Go语言解析JSON完整指南:结构体、数组与灵活映射

周末不加班
周末不加班
发布时间:2026-10-15| 2人浏览过
原创

在Go开发中,处理JSON数据是高频需求。本文详细介绍如何利用内嵌的encoding/json包进行数据解析。内容包含JSON到结构体、切片、嵌套对象的标准化转换方法,Struct Tag标签机制处理特殊键名,以及针对动态或非结构化JSON采用通用Map结构的解析策略,确保高效且类型安全的数据读写。

1. JSON 解析为结构体 (Unmarshal)

最直观且常用的方式是将 JSON 映射为 Go 的结构体(Struct)。Go 提供了标准库 encoding/json 来处理这一过程。

第1步:定义结构体并匹配字段

创建对应的 Struct 时,需遵循以下规则:

  • 首字母大写:Go 中只有首字母大写的字段是“导出的”(Exported),json.Unmarshal 才能访问。如果字段以小写字母开头,将无法被正确解析。
  • 类型对应:JSON 字符串对应 string,数字对应 int/float64 等。

假设目标 JSON 如下:

{
  "name": "yuzhou1su",
  "age": 18
}

对应的 Go 结构体定义如下:

type Person struct {
	Name string
	Age  int
}

第2步:使用 json.Unmarshal 执行转换

json.Unmarshal 函数接收两个参数:要解析的字节切片([]byte)和指向目标的指针。

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	var p Person
	jsonString := `{"name": "yuzhou1su", "age": 18}`

	// 关键:需要将 JSON 转为 []byte,传入结构体实例的地址 &p
	err := json.Unmarshal([]byte(jsonString), &p)

	if err == nil {
		fmt.Println(p.Name) // 输出: yuzhou1su
		fmt.Println(p.Age)  // 输出: 18
	} else {
		fmt.Println("解析失败:", err)
	}
}

2. JSON 解析为数组或切片

当 JSON 数据是一系列对象组成的数组时,应将其解析为结构体的切片(Slice)。

第1步:定义单条数据的结构体

type Student struct {
	Id   int
	Name string
	Age  int
}

第2步:解析 JSON 数组

利用 for...range 迭代切片:

func main() {
	var students []Student
	myClass := `[
      {"id": 1, "name": "张三", "age": 20},
      {"id": 2, "name": "李翠花", "age": 18},
      {"id": 3, "name": "王老五", "age": 25}
    ]`

	err := json.Unmarshal([]byte(myClass), &students)
	if err == nil {
		for _, s := range students {
			fmt.Printf("ID: %d, Name: %s, Age: %d\n", s.Id, s.Name, s.Age)
		}
	}
}

3. 解析嵌套 JSON 对象

对于具有层级结构的 JSON,可以在主结构体中嵌套另一个结构体,或者直接在内部使用匿名结构体。

操作说明

以包含地址信息的用户数据为例,我们将 address 字段直接定义为匿名字段:

type Person struct {
	Name string
	Age  int
	Address struct {
		Road     string
		City     string
		Province string
		Country  string
	}
}

这种处理方式简化了调用链,通过 p.Address.Road 即可直接获取内嵌数据。若嵌套层数过深,建议单独定义 Address 结构体以保持代码整洁。

4. 自定义字段映射:Struct Tag

有时 JSON 的 Key 与 Go 变量的命名习惯不符(例如包含空格、下划线或大小写不一致),直接使用结构体默认映射会失败。此时需要使用 Struct Tag(结构标签)。

第1步:添加 JSON 标签

在结构体字段后添加反引号包裹的标记,指定 JSON 中的确切 Key:

type Rates struct {
	Base   string `json:"base currency"`
	Symbol string `json:"destination currency"`
}

这样,即使 JSON 中包含空格(如 "base currency"),Go 也能准确将其映射到 Base 字段。

5. 解析非结构化/动态 JSON

在实际业务中,面对 API 返回的大型且未知的 JSON 格式,预先定义所有字段既繁琐又易出错。此时可使用通用的 map[string]interface{} 来“捕获”任意 JSON。

第1步:声明动态容器

var result map[string]interface{}

interface{} 表示该值可以是任何类型(string, int, bool, object, array等)。

第2步:按需提取数据

func main() {
	jsonString := `{"success": true, "timestamp": 1588779306, "rates": {"BTC": 0.00002}}`
	var result map[string]interface{}

	err := json.Unmarshal([]byte(jsonString), &result)
	if err == nil {
		// 访问具体字段
		fmt.Println(result["success"])          // true (bool)
		rates := result["rates"]               // map[string]any
		fmt.Println(rates["BTC"])             // 0.00002 (float64)
	}
}

总结

掌握 Go 语言的 JSON 处理主要依赖对 encoding/json 包的熟练使用。

  • 定型数据:优先使用 Struct + Unmarshal,保证类型安全和编译期检查。
  • 命名冲突:善用 json:
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。