目前最稳定的是quicktype插件,支持中文、嵌套结构及蛇形转驼峰;需选中完整json,对null/混合类型建议用strict模式或预处理;生成后常需手动调整omitempty、指针及字段名映射。

VSCode里用什么插件能直接转JSON为Go struct
目前最稳定、更新勤、支持中文字段和嵌套结构的,是 QuickType 插件(官方名 quicktype),不是 JSON to Go 那类老插件——后者对数组嵌套、空值、类型歧义处理很弱,容易生成 interface{} 或直接崩。
安装后右键 JSON 内容 → “Quicktype: Generate Structs”,选 Go 语言,它会自动推断字段类型(比如 "id": 123 → ID int `json:"id"`)。
- 必须先选中完整 JSON(包括外层
{}或[]),光标在内容里但没选中,会报No JSON content selected - 如果接口返回的是数组(如
[{"name":"a"},{"name":"b"}]),QuickType 默认按元素生成 struct,但不会包一层type Resp []Item——得手动补 - 字段含下划线(如
user_name)时,它默认转成UserName,但 tag 里仍保留json:"user_name",这点不用改
遇到 null 字段或混合类型(string/number)怎么不崩
真实接口常有 "price": null 或 "price": "99" 和 "price": 99 混用,QuickType 默认按第一个样本推断,后面类型不一致就生成 interface{} 或报错。
解决办法是:在粘贴 JSON 前,手动把可疑字段统一成一种类型(比如全改成 null 或全写成字符串),或者用 QuickType 的「strict 模式」(右键菜单里选 Generate with strict typing)——它会强制加 json.RawMessage 或指针类型,例如:
Price *float64 `json:"price,omitempty"`
-
*float64能同时接null、数字、缺失字段;但接字符串会反序列化失败,得靠上层预处理 - 如果字段可能为
"123"或123,别硬撑,直接用json.RawMessage,后续自己json.Unmarshal - 千万别依赖插件自动“猜对”,先看一眼原始响应里那个字段实际有哪些值
生成的 struct 字段名大小写和 JSON tag 对不上怎么办
Go 要求导出字段首字母大写,但 JSON 字段名是小写的(如 "created_at"),QuickType 默认做蛇形转驼峰(CreatedAt),并加 json:"created_at" tag ——这没问题。
但如果你的后端字段是 "createdAt"(驼峰),它可能生成 Createdat(错误拆分),或漏掉 tag。这时要手动干预:
- 右键 → “
Quicktype: Configure Generation”,把acronym-style改成none,避免把URL、ID、API错切成Url、Id - 字段名含大小写混搭(如
"iOSVersion"),QuickType 可能变成Iosversion,得在生成后手动修字段名,并确保jsontag 显式写对:iOSVersion string `json:"iOSVersion"` - 如果项目强制要求字段名和 JSON 完全一致(极少见),就别用自动工具,手写 +
go:generate更稳
为什么生成的代码没有 omitempty,或者多了不该有的指针
QuickType 默认不加 omitempty,所有字段都强制存在;而生产接口里大量字段是可选的(null 或缺失)。不加会导致反序列化失败或字段被清零。
指针字段(*string)是它应对 null 的默认策略,但多数场景你其实想要值类型 + omitempty(比如 Name string `json:"name,omitempty"`)。
- 生成后全局替换
`json:"xxx"`为`json:"xxx,omitempty"`是最快方案(注意别误替换了嵌套 struct 里的) - 想一劳永逸?在 QuickType 配置里打开
omit-empty选项(配置文件里加"omit-empty": true) - 指针字段没法全自动删——因为
null和“字段不存在”语义不同,得你根据接口文档判断哪些真要指针,哪些只是可选
真正麻烦的从来不是生成那一秒,而是生成后要不要改、改多少、依据是什么。盯着接口文档比盯着生成结果重要得多。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











