如何使用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; ?>
】
相关推荐
- c++如何连接Redis c++ hiredis库
- Win11怎么设置环境变量_Win11配置Path
- 如何在Golang中实现基础配置管理功能_Gola
- c++23 std::expected怎么用 c+
- php订单日志怎么按金额排序_php按订单金额排序
- Windows怎样关闭Edge新标签页广告_Win
- Python解释执行模型_字节码流程说明【指导】
- 如何更改Windows资源管理器的默认启动位置?(
- 如何在 ACF 中正确更新嵌套多层的 Group
- 如何使用Golang捕获并记录协程panic_保证
- Python 中将 ISO 8601 时间戳转换为
- Win11怎么设置声音输出设备_Windows11
- php删除数据怎么加限制_带where条件删除避免
- Linux如何安装Tomcat应用服务器_Linu
- Win11怎么调整屏幕亮度_Windows 11调
- Windows10如何更改鼠标图标_Win10鼠标
- C++友元类使用场景_C++类间协作设计方式讲解
- Win11怎么设置任务栏图标大小_Windows1
- Windows10如何更改计算机工作组_Win10
- Python抽象类与接口设计_规范说明【指导】
- 如何使用Golang实现微服务事件驱动_使用消息总
- php485在php5.6下能用吗_php485旧
- 如何在Golang中处理通道发送接收错误_防止阻塞
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Windows10如何删除恢复分区_Win10 D
- LINUX如何开放防火墙端口_Linux fire
- php8.4如何配置ssl证书_php8.4htt
- Win10怎么卸载迅雷_Win10彻底卸载迅雷方法
- 如何在JavaScript中动态拼接PHP的bas
- windows 10专注助手怎么关闭_window
- Win11怎么关闭自动修复_跳过Win11开机自动
- Win10系统怎么查看端口状态_Windows10
- Python数据挖掘进阶教程_分类回归与聚类案例解
- 短链接还原php提示内存不足_调整PHP内存限制设
- 如何正确访问 Laravel 模型或对象的属性而非
- Win11怎么开启专注模式_Windows11时钟
- Python大文件处理策略_内存优化说明【指导】
- 当网站SEO排名下降时,如何应对?
- c++ stringstream用法详解_c++字
- c++ try_emplace用法_c++ map
- PythonGIL机制理解_多线程限制解析【教程】
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- Win11开机Logo怎么换_Win11自定义启动
- 如何在Mac上搭建Golang开发环境_使用Hom
- Win10系统字体模糊怎么办_Windows10高
- php串口通信波特率怎么选_根据硬件手册设置正确波
- php打包exe后无法写入文件_权限问题解决方法【
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- 如何在Golang中使用replace替换模块_指
- Python类装饰器使用_元编程解析【教程】

QQ客服