如何正确使用 json.NewDecoder 解析 JSON 中的整数字段

大芳酱_3404

大芳酱_3404

2026-09-22

481人浏览

原创

如何正确使用 json.NewDecoder 解析 JSON 中的整数字段

当 Go 的 json.NewDecoder.Decode 无法正确解析 JSON 中的整数(如 score_to_pass、time_limit)导致字段值为 0 时,常见原因是结构体标签中误加了 string 选项——该选项会强制将 JSON 字符串转为整数,若传入的是纯数字而非字符串,则解码失败并保留零值。

当 go 的 `json.newdecoder.decode` 无法正确解析 json 中的整数(如 `score_to_pass`、`time_limit`)导致字段值为 0 时,常见原因是结构体标签中误加了 `string` 选项——该选项会强制将 json 字符串转为整数,若传入的是纯数字而非字符串,则解码失败并保留零值。

在 Go 的标准库 encoding/json 中,json:"field,string" 标签是一个特殊指令:它表示该字段期望接收 JSON 字符串形式的数值(例如 "32"),并在解码时自动调用 strconv.Atoi 等函数将其转换为对应整型。但如果你的请求体发送的是原生 JSON 数字(如 "score_to_pass": 32),而非字符串(如"score_to_pass": "32"),那么带,string的标签会导致解码失败——Go 会静默跳过该字段,保留结构体字段的零值(即int0boolfalse`)。

你提供的原始结构体如下(已修正问题前):

type OnlineTestSet struct {
  ID                   int    `db:"id"                     json:"id"`
  OnlineTestSubjectId  int    `db:"online_test_subject_id" json:"online_test_subject_id"`
  Name                 string `db:"name"                   json:"name"`
  ScoreToPass          int    `db:"score_to_pass"          json:"score_to_pass"`
  TimeLimit            int    `db:"time_limit"             json:"time_limit"`
  // ... 其他字段
}

✅ 正确做法是:移除所有 ,string 后缀,确保 JSON 字段名与结构体字段的 json 标签完全匹配,且类型一致。

同时,务必在解码后检查错误——你当前的代码忽略了 Decode 的返回值,这会掩盖关键问题:

jm-jsjkxyjs02-pzl-803
jm-jsjkxyjs02-pzl-803

查询全球任意城市的实时天气和未来天气预报

下载
func NewOnlineTest(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  var jsonForm OnlineTestForm
  // ✅ 必须检查解码错误!
  if err := json.NewDecoder(r.Body).Decode(&jsonForm); err != nil {
    http.Error(w, "Invalid JSON: "+err.Error(), http.StatusBadRequest)
    return
  }

  if err := addNewOnlineTest(jsonForm.Form); err != nil {
    log.Printf("Failed to save online test: %v", err)
    http.Error(w, "Internal server error", http.StatusInternalServerError)
    return
  }

  w.WriteHeader(http.StatusOK)
  w.Write([]byte(`{"success": true}`))
}

? 验证技巧:

  • 使用 curl 测试时,确保 payload 是合法 JSON(无多余逗号、引号闭合);
  • Decode 后打印 jsonForm 值(如 log.Printf("%+v", jsonForm))可快速定位未填充字段;
  • 若 API 需兼容字符串/数字输入(如前端可能误传 "32"),应改用 json.RawMessage + 自定义 UnmarshalJSON,而非全局加 ,string

⚠️ 注意事项:

  • ,string 仅适用于 int, uint, float64 等数值类型,且仅当 JSON 中对应字段明确为字符串时才应使用
  • 混淆使用会导致静默失败,调试困难;
  • 数据库字段映射(如 db:"score_to_pass")与 JSON 解码无关,无需调整。

总结:Go 的 JSON 解码严格遵循类型契约。发送数字就用 json:"field",发送字符串才用 json:"field,string"。始终校验 Decode 错误,并结合日志快速定位字段绑定问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.06

2249

5

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

2023.09.25

4387

6

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.13

602

5

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

2023.10.26

6105

20

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2076

5

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2304

5

go语言开发工具大全
go语言开发工具大全

本专题整合了go语言开发工具大全,想了解更多相关详细内容,请阅读下面的文章。

2025.06.11

5039

12

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

2025.06.26

3257

12

go语言版本升级
go语言版本升级

本专题整合了go语言版本升级方法,想了解更多相关内容,请阅读专题下面的文章。

2025.06.27

5910

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习