You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:01:00