Go Web API POST请求JSON中StudentName、RollNo字段未正常存储
问题排查结果
核心原因是studentDb结构体的JSON标签配置和请求提交的JSON字段名不匹配,导致StudentName、RollNo两个字段反序列化时无法被正确赋值。
Go标准库encoding/json处理结构体和JSON互转的核心规则:
- 所有需要参与JSON读写的结构体字段必须首字母大写(导出可访问状态),否则json包无法读取/写入字段值,会直接忽略该字段
- 字段如果配置了
json:"xxx"格式的标签,会优先按照标签内指定的xxx作为键名,去匹配JSON里的对应字段(匹配时忽略大小写) - 字段如果没有配置json标签,会直接以结构体本身的字段名作为键名去匹配JSON字段
从你接口返回的响应可以看到,输出的JSON键为name、roll no、branch、gender、createdon,说明你定义的studentDb结构体标签大致如下:
type studentDb struct { Name string `json:"name"` RollNo string `json:"roll no"` Branch string `json:"branch"` Gender string `json:"gender"` CreatedOn time.Time `json:"createdon"` }
你POST请求提交的键是StudentName、RollNo,和结构体标签里定义的name、roll no完全不匹配,反序列化时这两个字段拿不到传入值,自然返回空。
而Gender、Branch两个字段能正常存储,是因为你传入的键名和标签里的gender、branch忽略大小写后完全一致,可以正常匹配赋值。
修复方案
两种方案选其一即可:
- 方案1:调整POST请求的JSON字段名,和结构体标签保持一致
{ "name": "test name", "roll no": "test number", "gender": "Male", "branch": "test " } - 方案2:修改
studentDb结构体的json标签,和你当前使用的请求字段名对齐
示例修改后的结构体定义:type studentDb struct { StudentName string `json:"StudentName"` RollNo string `json:"RollNo"` Gender string `json:"Gender"` Branch string `json:"Branch"` CreatedOn time.Time `json:"createdon"` }
额外提示:当前代码里直接用panic处理JSON解码、序列化错误的写法不可取,触发错误时会直接导致整个Web服务崩溃,建议改成返回对应400/500状态码和错误信息给客户端,不要直接panic。
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

