类型生成

JSON 转 Go让结构体覆盖实际收到的数据

观察两条示例记录的字段差异。输出包含包声明及必要的导入,可直接保存为 Go 源文件。

JSON 转 Go

JSON 输入

解析和生成均在当前浏览器内完成,不上传或存储输入。

Go 结果

生成选项

标签保留受支持的原键;any 中的数字需用 Decoder.UseNumber() 保真,指针无法区分缺失和 null。

3 个类型声明 · 2 个指针类型

JSON 转 Go 适合从接口响应起草数据模型。把同一接口的多条代表性记录放进数组,才能发现偶尔缺失、显式为 null 或类型变化的字段。

样本无法证明字段一定必填,也无法推导业务验证规则。生成结果需要结合真实接口约定检查,不能代替接口测试。

为什么使用 JSON 转 Go

后面的记录也参与推断

JSON 转 Go 检查同一数组位置的所有元素。第二条记录才出现的字段不会遗漏;已知类型遇到空值或缺失时可以生成指针,让零值与 nil 的区别显现出来。

两张字段不同的记录卡片汇入完整结构,空心指针标记表示缺失值。

先保留数字,再决定怎么用

普通整数字面量在 int64 范围内使用整数类型。小数、指数和超范围数字使用 json.Number,不先经过 JavaScript 浮点转换,长金额或标识数字不会在推断前被舍入。

一串较长的数字块完整进入输出结构中的对应槽位,没有丢失末尾块。

导出之前先检查这些差异

01

补齐有代表性的记录

把同一种响应的多条记录放进一个数组。不同属性位置的对象分别生成嵌套类型,不会因为形状相似就强行共用同一个类型。

02

只开启有依据的推断

时间必须保持原文时关闭日期推断。关闭嵌套命名会生成匿名结构体;关闭标签则失去原键映射,解码前需要特别核对字段名称。

03

选项变化后刷新结果

自动生成等待约 350 毫秒;关闭开关会显示生成按钮,也可按 Ctrl/Cmd+Enter。修改输入或选项会立即禁用导出,成功生成当前结果后才恢复。

Go 字段的命名与类型规则

导出字段与 json 标签

snake_case 和 camelCase 转为大写开头的导出字段,常见缩写如 ID 保持全大写。名称碰撞使用稳定的数字后缀,启用标签时保留可表示的原始键。

空值不必猜成字符串

已知标量或结构体遇到 null 或缺字段时默认使用指针;切片和映射本身可以为 nil。只见过 null 的字段使用 any,指针不能区分缺失和显式空值,也不代表必填校验。

数字类型依据原始写法

只有 int64 范围内的普通整数字面量才使用 int64。1.0 与 1e3 也使用 json.Number,因为标准解码器不能把这些写法直接装入整数。执行运算前仍需检查数值转换错误。

嵌套对象与有效时间

可选择独立命名的 Go 结构体或匿名嵌套对象。完整且日历有效的 RFC3339 字符串才推断为 time.Time,小数秒最多九位,同一位置的全部非空字符串都必须合格。

兼容范围与无法推断的内容

面向已有 Go 项目
JSON 转 Go Struct 输出使用 any,目标为 Go 1.18 以上及 encoding/json 的旧版兼容标签集合。不生成自定义解码器、验证规则、omitempty 或应用程序,也不把 Schema 当成类型契约解析。
标签不能保存任意键
启用标签时,空键、逗号、引号、反斜杠、反引号、控制字符和表情符号会报路径错误。此类数据需要映射或自定义解码器。键 - 使用标签 -,,避免字段被忽略。
动态类型还需配置解码器
混合类型使用 any,空数组使用 []any,空对象使用 map[string]any。向这些位置解码数字时应调用 Decoder.UseNumber(),否则默认解码器仍使用 float64;生成类型本身不会改变这个行为。
时间值不保证原文往返
非法日期、只有日期、没有时区或超过九位小数秒的字符串保持 string。time.Time 再编码可能规范化时区与末尾零;需要保留原文本时关闭时间推断。
严格语法与明确上限
拒绝注释、重复键、尾逗号和多个文档,不提供网址抓取、文件导入或自动修复。上限为输入 500,000 字符、深度 100、50,000 节点、1,000 类型声明及输出 1,000,000 字符。

JSON 转 Go 常见问题

支持哪些顶层 JSON 值?

对象、数组、字符串、数字、布尔值和 null 都可输入。非对象根值使用类型别名,确保 time.Time 与 json.Number 原有的解码方法仍然有效。

对象数组里缺少部分字段怎么办?

同一数组位置的所有对象都参与合并。某字段在部分记录中缺失且存在具体类型证据时,默认使用指针;切片与映射无需额外指针也能表示 nil。

null 和混合类型怎么推断?

只有 null 的位置使用 any;同一位置出现不兼容类型也使用 any。有具体标量或结构体证据再遇到 null 时才生成指针,不凭空猜测未知类型。

生成的 Go 类型还需要人工检查吗?

需要。JSON 转 Go 根据提供的样本推断,无法了解未出现的字段、业务必填关系或未来响应。请在项目中运行 gofmt、编译及真实解码测试。

嵌套对象会拆出独立结构体吗?

默认会按根类型和属性名生成独立类型。关闭嵌套命名选项会嵌入匿名结构体,其他推断规则不变;不同属性位置不会自动共用类型。

发现需要补充的推断边界?

从真实接口响应开始

使用 JSON 转 Go 汇总多条响应,检查指针、数字与日期选择,再下载源文件并在项目中验证。