ZH
我的工具

JSON 转 Go 结构体

将 JSON 转换为带 json 标签的 Go 结构体定义:采用 ID 等缩写词规则的导出名称,自动区分 int 与 float64,支持 omitempty,以及嵌套或内联结构体。

数组中部分元素缺少的字段始终会加上 omitempty。
Go
类型声明数
3

始终为 null、为空或类型混杂的字段会被标为 any 类型,待确定真实类型后请替换。

我的工具 →
广告

把 JSON 样本转换为带 json 标签的 Go 结构体定义,可直接配合 encoding/json 使用。键会变成遵循标准缩写词规则的导出 Go 名称(id → ID,avatar_url → AvatarURL),数字会根据所见的值变成 int 或 float64,有时为 null 的字段会变成指针,数组中部分元素缺少的字段会加上 omitempty。输出的字段是对齐的,粘贴后请运行 gofmt。

使用方法

  1. 粘贴一份有代表性的 JSON 样本,数组中包含多个元素时推断出的类型最好。
  2. 设置顶层结构体的名称。
  3. 选择把嵌套对象生成为独立的具名类型,还是内联匿名结构体。
  4. 把代码复制到你的包中,并按需修改名称或类型。

计算公式

string → string · 整数 → int(超出 32 位则为 int64)· 小数 → float64 · true/false → bool · [ … ] → []T · { … } → struct · null 或混合类型 → any

会跨数组元素合并同一位置上的值。只要有一个元素中的数字是小数,该字段就会变成 float64。在部分元素中为 null 的字段会变成指针(*string);在所有元素中都是 null,或包含不同种类值的字段会变成 any。每个字段都会带上 json:"avatar_url" 这样的标签,让 encoding/json 能映射回原始键。重复的键和超出有限安全整数范围的数字会被拒绝,其他小数遵循 JavaScript 精度。

示例

示例记录会生成三个类型。Root 包含 ID int、Name string、Email string、Active bool、Score float64、Tags []string、Address Address、Orders []Order 和 Manager any。Address 有三个字符串字段。Order 包含 ID string、Total float64(25.5 与 12 合并为 float64)、Items int,以及带 json:"coupon,omitempty" 的 Coupon string,因为只有一个订单有优惠券。

常见问题

为什么我的数字是 int 而不是 float64?

因为所见的值全都是整数。JSON 本身只有一种数字类型,12.0 也会被读成 12。如果该字段可能出现小数,请手动改成 float64。

为什么有些字段是指针?

因为该字段在至少一个样本中为 null。使用指针可以区分 JSON 的 null(nil)与空字符串这类零值。

应该用内联结构体还是独立结构体?

独立的具名类型更便于复用、测试和写文档;内联结构体可把一次性的响应放在同一个声明里。

omitempty 有什么作用?

序列化时,如果字段是零值(空字符串、0、false、nil),encoding/json 会把该字段省略;反序列化时没有影响。它无法区分字段缺失和显式的零值,如果需要区分,请使用指针或自定义类型。

资料来源

最后更新:

引用此工具
APA

kakaoCalc. (2026, November 8). JSON 转 Go 结构体. https://kakao.mobile/zh/tools/json-to-go-struct-tool/

MLA

“JSON 转 Go 结构体.” kakaoCalc, 8 Nov. 2026, kakao.mobile/zh/tools/json-to-go-struct-tool/.

广告