ToolConvoyToolConvoyv2.6
DEV

JSON 转 Go Struct — 从 JSON 生成 Go Struct 类型

从 JSON 生成带 json tag 的 Go struct。字段 CamelCase、可空值用 omitempty、自动识别 time.Time —— 浏览器内完成,无上传。

● 本地运行 · 在您的标签页中生成页面加载以来工具发出的网络请求:0 次

JSON to Go Struct

Convert JSON to Go struct with json tags. Works entirely in your browser.

Go 标准库自带了所有语言里最广泛使用的 JSON 解析器之一 —— encoding/json。它速度快、正确无误,且出了名地有「主见」:它要求 struct 字段是导出的(CamelCase,首字母大写),并通过 struct tag 把 JSON key 映射到 struct 字段。为每个 API 响应手写 Go struct,是 Go 服务开发中最常见的杂活 —— 通常从一个有代表性的 JSON 响应开始,粘到代码生成器里。生成器遍历 JSON 对象,为每个值推断 Go 类型,然后输出带正确 json tag 的 struct —— 一件手做要五分钟、机器做只要五毫秒的事,而且机器不会忘记在可空字段上加 omitempty

Go 里不那么显然的细节是指针类型。JSON 中,字段可能是「存在且有值」、「存在但为 null」、或「缺失」。在 Go 里,零值(空字符串、零 int、false bool)和缺失值在普通非指针字段上无法区分。标准库的解法是 omitempty:带 json:"key,omitempty" tag 的字段在持有零值时输出时被省略;指针类型(*stringomitempty)在指针为 nil 时省略,在指针非 nil 时输出为零值。生成器默认对样本中的可空字段选指针、对始终存在的字段选非指针 —— 这对大多数 API 都是合理的默认值,但如果你的 API 用 null 和缺失来表达不同含义,值得复核。

最后的交接:如果生成的 struct 进入一个 Go 服务,为日期解析、枚举校验或多态分发加上自定义 UnmarshalJSON 方法。如果目的地是数据库,在 json tag 旁边再添 db tag 以兼容 ORM。生成的 struct 是 schema —— 读写它的业务逻辑,才属于开发者那部分工作。

广告

使用方法

  1. 粘贴你的 JSON

    把 JSON 对象或对象数组粘到输入框。生成器遍历结构,为根生成 Go struct,并为每个对象形态各生成一个嵌套 struct。

  2. 选择命名风格

    在 CamelCase 字段(符合 Go 习惯的导出名)和全小写配 json tag 之间选择。为可空值切换 `omitempty`,以匹配标准库 JSON 序列化器的行为。

  3. 复制或下载 struct

    把 Go struct 复制到剪贴板,或下载为 .go 文件。输出可直接配合 `encoding/json` 和 `json.Unmarshal` 使用 —— 无需额外 import。

常见问题

为什么数值字段变成 float64 而不是 int?

按 JSON 规范,数字本身不区分布尔整数还是浮点数。生成器默认对含小数点的数字用 `float64`,对纯整数值用 `int`。如果样本数据没能覆盖你 API 可能返回的完整数值范围,手动加类型断言。

JSON null 值是怎么处理的?

样本中为 null 的字段会被处理成带 `omitempty` 的指针:`*string` `json:"key,omitempty"`。这是 Go 的惯用法 —— nil 指针代表「缺失」,指向零值的指针代表「在但为空」。如果你确定字段永远不会缺失,把指针和 omitempty tag 都去掉即可。

会输出 JSON 的 struct tag 吗?

会的,每个字段都带 `json:"original_key"` 或 `json:"original_key,omitempty"`。tag 保留 JSON key 的原始大小写,在源 JSON 用 snake_case、Go struct 字段用 CamelCase 的场景下这一点尤为重要。

嵌套对象和数组呢?

嵌套对象变成嵌套 struct,名字按 JSON key 派生为 CamelCase。数组变成 `[]Type` 切片。混合类型的数组变成 `[]interface{}` —— 如果数组是异构的,手动加类型断言或 Unmarshal 步骤。

会生成 main 函数吗?

不会。输出只是类型定义 —— 一个 struct。`func main()` 入口和 `json.Unmarshal` 调用需要自己写。生成器的任务是解决重复的类型定义工作,不是写完整的 Go 程序。

限制说明

  • 无自定义 Unmarshal 逻辑struct 使用默认的 encoding/json Unmarshal 行为。如果你的 JSON 用了自定义日期格式(非 RFC 3339)、数值型枚举,或多态类型键,需要自己写 UnmarshalJSON 方法。
  • 从单一样本推断类型样本里是数字的字段,在另一个 API 响应里可能是字符串。生成器基于样本推断类型 —— 如果你的 API 行为不一致,务必复核。
  • 不支持泛型输出是泛型之前的 Go(没有类型参数)。若需 Go 1.18+ 的泛型,后处理时手动添加类型约束或接口约束。

平台说明

macOS
GoLand、装了 Go 扩展的 VS Code,以及 vim-go 都能直接接受生成的 struct。浏览器工具适合一次性生成 —— 从浏览器或终端粘贴的样本 API 响应,转完即用。
Windows
Windows 上的 GoLand 和 VS Code 都能处理生成的 struct。浏览器工具适合从聊天、邮件或 API 浏览器粘贴的内容,这些场景下不想为生成一个 struct 而打开 IDE。
Linux
命令行环境下,`quicktype --lang go` 或 `gojson` 是标准等价方案。浏览器工具适合一次性生成,不值得为此安装 CLI 的场景。
Web
完全在客户端运行,页面加载后可离线使用。在受限环境或代码评审期间的快速转换都很有用。
广告
广告