如何使用Golang encoding/json解析JSON_Golang encoding/json解析与序列化示例
技术百科
P粉602998670
发布时间:2026-01-01
浏览: 次 Go 的 encoding/json 包要求结构体字段导出(首字母大写)才能解析,非导出字段被静默跳过;需用 json:"key" 标签显式映射,支持蛇形转驼峰但有限制;数组/对象须严格对应切片/struct;空值处理推荐 *T 或 json.RawMessage;混合类型应先用 map[string]json.RawMessage 延迟解析。
Go 的 encoding/json 包能直接将 JSON 映射为结构体,但前提是字段名匹配且导出(首字母大写),否则解析会静默失败或字段为空。
结构体字段必须导出才能被 json.Unmarshal 处理
Go 的反射机制无法访问非导出字段(小写开头),json.Unmarshal 会跳过它们,不报错也不赋值。
- 确保结构体字段首字母大写,例如
UserName而非userName - 用
json标签显式指定 JSON 键名,大小写无关:UserName string `json:"user_name"` - 如果 JSON 键是
"user_id",而结构体字段是UserID int,不加标签也能解析成功(Go 默认做蛇形转驼峰),但这是有限制的:仅支持简单下划线分隔,不支持多下划线或数字混排(如"user_id_v2"不会自动转成UserIDV2)
处理嵌套对象与切片时,类型必须严格对应
JSON 数组必须映射为 Go 切片([]T),JSON 对象必须映射为 struct 或 map[string]interface;类型错配会导致
{}json.Unmarshal 返回 invalid character 或 cannot unmarshal object into Go value of type []xxx 类错误。
- 嵌套结构体需定义对应子 struct,不能用
interface{}除非你后续手动断言 - JSON 中可能缺失的字段,建议用指针类型(如
*string)或加omitempty标签避免零值干扰 - 若不确定某字段是对象还是字符串(如某些 API 返回
"data": {}或"data": "null"),优先用json.RawMessage延迟解析
反序列化空值、null 和缺失字段的差异
JSON 中的 null、字段不存在、空字符串,在 Go 结构体中表现不同,直接影响业务逻辑判断。
-
string字段遇到 JSONnull→ 解析失败(invalid character 'n' looking for beginning of value),除非字段类型是*string -
*string遇到null→ 指针为nil;遇到缺失字段 → 也是nil;二者无法区分,需靠业务约定或额外字段标识 -
sql.NullString可区分Valid == false(null 或缺失)和Valid == true && String == ""(空字符串),适合对接数据库场景
type User struct {
ID int64 `json:"id"`
Name string `json:"name"`
Avatar *string `json:"avatar,omitempty"`
Metadata json.RawMessage `json:"metadata"`
}
data := []byte(`{"id": 123, "name": "alice", "avatar": null}`)
var u User
err := json.Unmarshal(data, &u)
// u.Avatar == nil,u.Metadata == json.RawMessage("null") —— 注意:RawMessage 不会解析,保留原始字节
真正麻烦的是混合类型字段(比如某个字段有时是对象、有时是字符串),这时候别硬套 struct,先用 map[string]json.RawMessage 提取再按需解析,否则容易 panic 或丢数据。
# 的是
# 也不
# 是有
# 也能
# 不存在
# 跳过
# 下划线
# 先用
# js
# json
# go
# golang
# 对象
# String
# int
# 字节
# 指针
# 字符串
# nil
# 数据库
# Interface
# NULL
# 结构体
# Struct
# 切片
# map
# 指针类型
# 空字符串
# Object
# for
# sql
# 首字母
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- Win11怎么设置多显示器任务栏 Win11扩展任
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- 如何使用Golang defer优化性能_减少不必
- 如何在Golang中实现CI/CD流水线自动化测试
- Win11怎么查看wifi信号强度_检测Windo
- php8.4如何配置ssl证书_php8.4htt
- Windows10系统更新错误0x80070002
- PHP主流架构怎么部署到Docker_容器化流程【
- Win11怎么恢复出厂设置_Win11重置此电脑保
- Win11怎么设置指纹解锁 Win11笔记本录入指
- c++协程和线程的区别 c++异步编程模型对比【核
- Win11怎么设置右键刷新选项_Windows11
- php怎么下载安装并配置环境变量_命令行调用PHP
- phpstudy本地环境mysql忘记密码_重置m
- c++怎么使用std::unique实现去重_c+
- 如何使用Golang实现文件加密_Golang c
- PHP的Workerman对架构扩展有啥帮助_应用
- Win11讲述人怎么关闭_Win11误触开启语音朗
- php接口返回数据乱码怎么办_php接口调试编码问
- c++ namespace命名空间用法_c++避免
- windows如何备份注册表_windows导出和
- windows 10专注助手怎么关闭_window
- 如何使用Golang实现容器健康检查_监控和自动重
- php中::能用于接口静态方法吗_接口静态方法调用
- 微信JSAPI支付回调PHP怎么接收_处理JSAP
- Linux怎么修改用户密码_Linux系统pass
- 当网站SEO排名下降时,如何应对?
- php删除数据怎么软删除_添加is_del字段标记
- Win11怎么查看激活状态_查询Windows 1
- Windows任务计划服务异常原因_任务调度失败的
- 如何在JavaScript中动态拼接PHP的bas
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- Win11怎么设置闹钟_Windows 11时钟应
- LINUX如何开放防火墙端口_Linux fire
- Win11怎么更改计算机名_Windows11系统
- php内存溢出怎么排查_php内存限制调试与优化方
- PHP的FastAdmin架构适合二次开发吗_特点
- 如何在 ACF 中正确更新嵌套多层 Group 字
- 电脑的“网络和共享中心”去哪了_Windows 1
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Win11摄像头无法使用怎么办_Win11相机隐私
- Windows10系统怎么查看系统版本_Win10
- php485支持哪些操作系统_php485跨系统支
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- 如何使用Golang实现RPC序列化与反序列化_G
- Windows10如何更改鼠标图标_Win10鼠标
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- c++怎么处理多线程死锁_c++ lock_gua
- Win11怎么关闭自动调节亮度 Win11禁用内容

QQ客服