type Profile struct {
Age int `json:"age"`
City string `json:"city"`
}
type AutoGenerated struct {
ID int `json:"id"`
Name string `json:"name"`
Active bool `json:"active"`
Score float64 `json:"score"`
Tags []string `json:"tags"`
Profile *Profile `json:"profile"`
}关于 JSON 转 Go 结构体
JSON 转 Go 结构体工具把 JSON 示例自动转换成带正确类型与 json 标签的 Go struct 定义,支持嵌套对象、数组与指针字段的智能推断。写 Go 后端时再也不用手动对照接口文档敲结构体,粘贴响应样例即可拿到可直接编译的代码,并可选导出 Omitempty 或自定义包名。所有转换在浏览器本地完成,示例数据不上传,适合处理含业务字段的接口响应。生成的代码符合 Go 惯例,能直接融入项目,大幅减少联调前的准备工作,也让前端同学在不熟悉 Go 标签语法时也能快速产出可用模型。面对嵌套很深的响应,它也能正确展开为带指针的字段,避免手动写错层级结构;生成的代码符合 Go 惯例能直接编译,大幅减少联调前的准备时间,也让不熟悉 Go 标签语法的同学能快速产出可用模型而不必反复试错。
把接口返回的结构转成 Go 结构体,是接入服务时最先要做的一步。Go 的强类型与显式的空值处理让类型定义必须写准,否则编译期或运行时都会出问题:该用指针的地方写成值类型会丢失「存在与否」的信息,该用固定宽度整数的地方用错类型会让大数值溢出。 生成原理是解析 JSON 并推断字段类型,同时把字段名映射为导出字段并附上标签。几处关键判断需要人工把关:可空性无法从单个样本推断,必须靠多个样本覆盖字段缺失与取值为空的场景,并用指针或可空包装类型表达;数字类型上,整数与浮点要分开,超过安全范围的整数与金额应使用字符串或定点类型,避免精度丢失;时间字段是字符串还是时刻类型,取决于接口是否带偏移量。 使用要点:字段名映射时注意导出规则——Go 只有在字段导出时序列化库才能写入,因此字段名首字母必须大写,同时用标签指明原始键名,两者缺一不可,缺了标签会出现「结构体字段全是零值」的静默失败。嵌套结构建议拆成命名类型而不是内联匿名结构,便于复用与添加方法;数组元素类型应确认是否可能混合,混合数组在强类型语言里需要更宽的表示。 边界与限制:类型推断无法表达业务约束,例如枚举取值、必填校验与取值范围,这些要靠校验标签或后续校验逻辑补齐。生成代码只是起点,不应不加审查地直接进入生产代码,尤其当样本里含调试字段时,会把不该存在的字段固化进契约。此外,Go 的零值与「字段缺失」不可区分,若业务上需要区分,必须使用指针或额外的存在标记,这一层设计应在生成后补齐而不是留待运行期发现。 数据与隐私:用于生成的样本常含真实用户数据与令牌。本工具在浏览器内完成推断与生成,不上传样本;用生产响应生成类型前,建议先替换掉令牌与个人标识。
误用集中在空值与数字类型上:样本里字段都有值时无法推断可空性,生成的字段全是值类型,遇到空值会在反序列化阶段静默变成零值;金额用浮点类型则会出现分位误差。此外 Go 只有导出字段才能被序列化库写入,字段名未大写而只加了标签,会出现「字段存在但全是零值」的静默失败。
实现原理
生成把 JSON 结构映射成结构体并附标签。Go 的导出规则是硬约束:只有首字母大写的字段才能被序列化库写入,同时需要标签指明原始键名,两者缺一不可——只写标签而字段未导出,会出现「字段存在但值全是零」的静默失败。可空性、数字类型与时间表示都需要人工把关。
{"user_id":1}type Root struct { UserID int `json:"user_id"` }(字段名需导出且标签必须存在)使用方法
- 打开「JSON 转 Go 结构体」
- 选择源格式与目标格式
- 根据需要调整输出选项
- 点击「转换」按钮,结果实时显示
- 复制或导出结果
使用场景
- 对接 REST 接口 — 把接口返回的 JSON 粘进来,立即得到可 Unmarshal 的 Go 结构体。
- 定义配置结构 — 根据配置文件样例生成 struct,用于加载 YAML/JSON 配置。
- 编写爬虫/采集器 — 为第三方接口快速建模,省去手写字段的时间。
- 生成 gRPC/消息体 — 从样例数据反推结构,作为消息或 DTO 定义的起点。
- 学习 Go 类型映射 — 直观看到 JSON 各类型对应的 Go 类型,辅助学习。
常见问题
字段名是怎么转换的?
按 Go 规范转为导出的大驼峰(首字母大写),并对 Id/URL/API 等常见缩写做大写处理,同时保留原始 json tag。
null 值会推断成什么?
值为 null 时推断为 interface{},因为无法确定具体类型。建议用非空样例获得更精确的类型。
omitempty 有什么用?
开启后会在 json tag 上追加 ,omitempty,序列化时空值字段会被省略,适合可选字段较多的场景。
嵌套对象怎么处理?
每个嵌套对象会生成独立的命名 struct,并在父结构体中以指针引用,结构清晰、可复用。
生成后需要调整吗?
输出是标准 Go 代码,复制后可重命名 struct、调整类型或加注释。整数默认 int、小数默认 float64,可按需改成 int64 等。
时间/日期字段会特殊处理吗?
默认按字符串生成(string)。若接口字段是标准时间格式,可在生成后改成 time.Time 并在 json tag 中声明格式,由 encoding/json 自动解析。
生成的 struct 字段名是 exported(大写)能改小写吗?
Go 要求字段可导出才能被 encoding/json 序列化,所以首字母必须大写;小写字段配合 json tag 也可以,但工具默认生成可导出形式。改小写请同时补上 json:"camelCase" tag,否则序列化行为会变。
数字被生成为 float64,能生成 int 吗?
样本里出现 1.0 或 1.5 这类值时工具保守地用 float64;整数与浮点混存的字段同样如此。要精确类型,手动把确认无小数的字段改为 int/int64。Go 的 json 解码本身对 interface{} 也只给 float64,这不是工具的限制。