如何使用Golang实现JSON数据解析_读取和操作JSON文件内容

发布时间 - 2026-01-02 00:00:00    点击率:
Go语言用encoding/json包解析JSON,需定义带json标签的结构体,用json.Unmarshal反序列化、json.Marshal序列化,支持嵌套、数组、动态结构及文件读写,注意错误处理和类型匹配。

Go语言内置的encoding/json包提供了简洁高效的方式解析、读取和操作JSON数据,无需第三方依赖。核心在于理解结构体标签(struct tags)、反序列化(json.Unmarshal)与序列化(json.Marshal)流程,以及如何处理嵌套、动态或不规则JSON。

读取JSON文件并解析为Go结构体

这是最常见场景:将磁盘上的JSON文件内容加载进内存,并映射为类型安全的Go结构体。

  • os.ReadFile(Go 1.16+)或ioutil.ReadFile(旧版)读取文件字节流
  • 定义与JSON字段一一对应的Go结构体,通过json:"field_name"标签指定映射关系(支持大小写、省略空值、重命名等)
  • 调用json.Unmarshal(data, &v)完成反序列化;注意传入指针,且检查错误

示例:

type User struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email,omitempty"` // 空字符串时序列化中忽略
    Active bool  `json:"active"`
}

data, err := os.ReadFile("user.json")
if err != nil {
    log.Fatal(err)
}
var u User
if err := json.Unmarshal(data, &u); err != nil {
    log.Fatal(err)
}
fmt.Printf("User: %+v\n", u)

处理嵌套JSON和数组

JSON中常见对象嵌套、数组列表,Go中对应结构体字段可声明为嵌套结构体或切片。

  • 嵌套对象:在结构体中嵌入另一个结构体字段,标签照常标注
  • JSON数组:字段类型设为[]T,其中T是元素结构体或基础类型
  • 混合数组(如不同对象类型混排)需用interface{}json.RawMessage延迟解析

例如:

type Address struct {
    City  string `json:"city"`
    Zip   string `json:"zip"`
}

type Profile struct {
    Name     string   `json:"name"`
    Addresses []Address `json:"addresses"`
}

动态解析未知结构的JSON

当JSON结构不确定(如API返回格式多变、配置项灵活),可用map[string]interface{}json.RawMessage

  • json.Unmarshal支持直接解析到map[string]interface{},但需类型断言访问值(如v["age"].(float64)
  • json.RawMessage可暂存未解析的JSON片段,推迟到需要时再解,避免重复解析或中间转换开销
  • 对深层嵌套路径查找,可配合gjson等轻量库(非标准库,按需引入)

修改并写回JSON文件

解析后修改结构体字段,再序列化保存即可。

  • 修改结构体字段值(如u.Name = "Alice"
  • json.MarshalIndent生成格式化JSON(便于阅读和调试),或json.Marshal生成紧凑格式
  • 使用os.WriteFile写入文件;注意设置合理权限(如0644

示例:

u.Name = "Alice"
u.Active = true
output, err := json.MarshalIndent(u, "", "  ")
if err != nil {
    log.Fatal(err)
}
if err := os.WriteFile("user.json", output, 0644); err != nil {
    log.Fatal(err)
}

不复杂但容易忽略:始终检查Unmarshal/Marshal的错误;注意JSON数字默认解析为float64,整数场景建议显式定义为int并确保源数据合规;时间字段推荐用time.Time配合json:"time,string"实现RFC3339字符串解析。


# js  # json  # go  # golang  # go语言  # 字节  # ai  # 字符串解析  # json数组  # 标准库  # String  # 字符串  # 结构体  # int  # 指针  # Struct  # Interface 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何为API编写文档_Laravel API文档生成与维护方法  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel如何处理异常和错误?(Handler示例)  jQuery validate插件功能与用法详解  制作旅游网站html,怎样注册旅游网站?  js实现点击每个li节点,都弹出其文本值及修改  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Python自动化办公教程_ExcelWordPDF批量处理案例  无锡营销型网站制作公司,无锡网选车牌流程?  如何在腾讯云服务器上快速搭建个人网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  EditPlus中的正则表达式实战(6)  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Laravel如何发送系统通知?(Notification渠道示例)  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  手机软键盘弹出时影响布局的解决方法  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  原生JS获取元素集合的子元素宽度实例  Android使用GridView实现日历的简单功能  大同网页,大同瑞慈医院官网?  如何选择可靠的免备案建站服务器?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Bootstrap CSS布局之列表  Laravel如何使用Telescope进行调试?(安装和使用教程)  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  ,南京靠谱的征婚网站?  如何正确下载安装西数主机建站助手?  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  深圳网站制作平台,深圳市做网站好的公司有哪些?  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  java获取注册ip实例  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何实现API资源集合?(Resource Collection教程)  bing浏览器学术搜索入口_bing学术文献检索地址  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧