首页 > 后端开发 > Golang > 正文

如何在Golang中处理JSON数组与对象

P粉602998670
发布: 2025-10-28 12:22:01
原创
1020人浏览过
答案:Golang中处理JSON需用encoding/json库,固定结构用结构体加tag,动态结构用map[string]interface{},数组用切片解析,序列化用json.Marshal,反序列化用json.Unmarshal,注意omitempty、类型断言和指针传递细节。

如何在golang中处理json数组与对象

在Golang中处理JSON数组与对象,主要依赖标准库 encoding/json。核心操作包括序列化(结构体转JSON)和反序列化(JSON转结构体或map)。下面介绍常见使用方式和技巧。

定义结构体处理JSON对象

如果JSON数据结构固定,推荐使用结构体。通过字段标签(tag)映射JSON键名。

示例:
type User struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Email string `json:"email,omitempty"` // omitempty 表示空值时忽略
}
登录后复制

使用 json.Unmarshal 解析JSON字符串到结构体:

jsonData := `{"name": "Alice", "age": 25}`
var user User
err := json.Unmarshal([]byte(jsonData), &user)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", user) // 输出:{Name:Alice Age:25 Email:}
登录后复制

使用 map 处理动态JSON对象

当JSON结构不固定或字段未知时,可用 map[string]interface{} 接收。

立即学习go语言免费学习笔记(深入)”;

Pixie.haus
Pixie.haus

AI像素图像生成平台

Pixie.haus 561
查看详情 Pixie.haus
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonData), &data)
if err != nil {
    log.Fatal(err)
}
fmt.Println(data["name"]) // 输出 Alice
登录后复制

注意:嵌套对象也会被解析为 map[string]interface{},访问时需类型断言。

处理JSON数组

JSON数组可解析为切片。若元素是对象,可使用结构体切片或 []map[string]interface{}。

结构体切片示例:
type Product struct {
    ID    int     `json:"id"`
    Name  string  `json:"name"`
    Price float64 `json:"price"`
}

jsonData := `[{"id":1,"name":"Laptop","price":999.9},{"id":2,"name":"Mouse","price":25.5}]`
var products []Product
err := json.Unmarshal([]byte(jsonData), &products)
if err != nil {
    log.Fatal(err)
}
for _, p := range products {
    fmt.Printf("产品: %s, 价格: %.2f\n", p.Name, p.Price)
}
登录后复制
使用切片 + map 处理不确定结构:
var items []map[string]interface{}
err := json.Unmarshal([]byte(jsonData), &items)
if err != nil {
    log.Fatal(err)
}
for _, item := range items {
    fmt.Println("名称:", item["name"])
}
登录后复制

序列化结构体或map为JSON

使用 json.Marshal 将Go数据转换为JSON字节流。

user := User{Name: "Bob", Age: 30}
data, err := json.Marshal(user)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data)) // 输出:{"name":"Bob","age":30,"email":""}

// 格式化输出(带缩进)
data, _ = json.MarshalIndent(user, "", "  ")
fmt.Println(string(data))
登录后复制

基本上就这些。关键是根据数据是否固定选择结构体还是map,合理使用 tag 控制字段行为。处理数组时注意目标类型的匹配。不复杂但容易忽略细节,比如指针传递和类型断言。

以上就是如何在Golang中处理JSON数组与对象的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号