JSON 转 Go 结构体

粘贴一个 JSON 对象,即可得到对应的 Go 结构体:每个对象一个结构体,每个列表一个切片,每个名称都有一个保留原样的 json 标签。

免费 在浏览器中运行 核对于2026年11月12日星期四

完整的 JSON 文本,顶层为花括号。名称保持原有的顺序,数字保留原有的每一位。内容不会被发送或保存。

最外层结构体的名称。使用字母、数字和下划线,并以字母开头。

添加 omitempty 选项,这样字段为空时,encoding/json 会在输出中省略该字段。

结果

Go 代码 — 可以复制,也可以下载为 models.go。
检查 — JSON 能够转换时显示绿色。红色会指出出错的位置和原因。
Go 代码

此工具在您的浏览器中运行。您输入的内容不会发送给我们。

使用方法

  1. 把 JSON 对象粘贴到 JSON 对象 中。整段文本必须是一个对象,顶层为花括号。
  2. 输入 根结构体名称,例如 Product;如需该选项,请勾选 为每个标签添加 omitempty。
  3. 查看 检查。绿色表示对象已转换,红色则指出问题所在的位置。
  4. 把 Go 代码 复制到带有 package 声明的文件中,或下载为 models.go。

Go 类型如何选择

每个 JSON 值都对应一个能容纳它的 Go 类型。字符串变为 string,true 或 false 变为 bool。encoding/json 的 Unmarshal 规则(英文)决定 JSON 如何被读回这些类型。

  • 能放进64位的整数变为 int64。带小数点或指数的数,如1.0、2e3,变为 float64;超出 int64 范围的整数也变为 float64。
  • null 变为 any。如果 null 与另一类型的值并列,它就取那个类型,因为 null 不会改变 Go 中另一类型的值。
  • 对象变为结构体,列表则取其元素共同的类型。同一列表中的多个对象合并为一个结构体;元素类型不一致的列表变为 []any。
  • 空对象变为空结构体,空列表变为 []any。

名称、标签与重名

每个字段的名称取自 JSON 中的名称:各个词连接起来,每个词的首字母大写,因此 user-name 变为 UserName。Go 语言规范(英文)规定,首字母大写的字段名会被导出,这就是首字母要大写的原因。json 标签保留名称的原样,因此读回 JSON 时能匹配同一个键。

两个生成相同 Go 名称的名称会加上数字,例如 AB 和 AB2;名称已被占用的结构体也会加上数字。列表中的项以所在列表的名称命名,因此 products 生成名为 Product 的结构体;无法还原单数形式的名称则加后缀 Item。

  • 含有逗号、单个短横线或没有字符的名称不能用作 json 标签,因此工具会指出该键并停止。
  • 开启 omitempty 时,每个标签都会加上该选项。工具会把根结构体名称的首字母大写,因此 product 变为 Product。

本工具不做的事

  • 它不添加 package 声明或 import。请把代码粘贴到已有自己 package 声明的文件中。
  • 它不为可选字段使用指针。JSON 中缺失或为 null 的字段,与值为零值的字段无法区分。
  • 它不会把名称改为 Go 常用的缩写形式,因此 id 变为 Id。如果您的代码风格要求 ID,请手动改名。

示例:一个订单,含所有者和两件商品

这个订单的 JSON 含有一个整数、一个小数、一个对象和一个含两个对象的列表。下表给出每个 JSON 名称对应的 Go 字段。本工具会在表格之下写出三个结构体,外层的 Order 结构体排在最前面。

JSON 名称 Go 字段 Go 类型 标签
id Id int64 json:"id"
ratio Ratio float64 json:"ratio"
owner Owner Owner json:"owner"
items Items []Item json:"items"

常见问题

为什么整数是 int64 而不是 int?

int64 是固定为64位的有符号整数,可以容纳从 -9223372036854775808 到 9223372036854775807 之间的每一个整数。本工具对能放进它的整数都使用这一类型,因此数值不会溢出。如果您的代码需要 int,请手动修改类型。

为什么 null 会变成 any?

Go 没有一个能单独容纳 null 的类型,因此本工具使用 any,它可以容纳任何值。与另一类型的值并列的 null 则取那个类型,因为 encoding/json 在读取 null 时,不会改变 Go 中另一类型的值。

为什么我的字段叫 Id 而不是 ID?

本工具只把每个词的首字母大写,不套用 Go 的常用缩写规则,因此 id 变为 Id。json 标签仍然是 id,所以数据的读取方式不变。如果您的代码风格要求 ID,请改名。

输出需要哪个 Go 版本?

输出中的 null 使用 any,而 any 是在 Go 1.18 中加入的 interface{} 别名。如果您的代码版本较旧,请把 any 换成 interface{},两者是同一个类型。

为什么工具会拒绝某些名称?

json 标签的值是名称,之后可以跟着以逗号开始的选项,因此含逗号的名称无法写入标签。单个短横线的标签会隐藏字段,所以这样的名称也会被拒绝。

我粘贴的 JSON 会被发送到什么地方吗?

不会。转换在您的浏览器中完成,您粘贴的内容不会被保存或发送到我们的服务器。请不要把密码或令牌粘贴到您不信任的任何页面中。

资料来源

数据和文字最近核对于2026年11月12日星期四。

我们使用必要的 Cookie 来运行网站。经您同意后,Google 还会使用广告 Cookie 展示个性化广告。如果您拒绝,仍会看到广告,但广告不会个性化。