在线JSON转Go结构体工具

贴一段 JSON、生成可直接编译的 Go 结构体、带 json tag、整数用 int

要 TypeScript 版本? JSON 转 TypeScript

关于JSON转Go结构体

贴一段 JSON,输出能直接编译的 Go 结构体。字段名按 Go 的习惯转(order_id → OrderID,created_at → CreatedAt),id、url、api、json 这类缩写按社区惯例全大写——OrderID 而不是 OrderId,这也是 staticcheck 的建议。

类型是按样本值推的,所以样本越多越准。

Go 没有 union 类型,一个字段只能有一种类型。这里的规则是:所有样本都是整数就给 int,出现过小数就给 float64;同一字段里既出现过整数又出现过小数,统一成 float64 而不是退化成 interface{};字符串和数字混着出现,那只能给 interface{}——这不是偷懒,是 Go 本身表达不了。

所以只贴一条样本时容易猜错:某个字段这一次是 1,但线上数据里可能是 1.5,就会生成 int。多贴几条真实数据再生成。

三个必须知道的坑:

一、超过 2^53 的整数在进来时就已经失真了。 {"id": 1234567890123456789} 里的数字,浏览器 JSON.parse 之后就是 1234567890123456800——不是这个工具算错的,是 JavaScript 数字只有 53 位精度。雪花 ID、订单号这类长整数请按字符串传("1234567890123456789"),或者后端用 json.Number 接收。

二、null 只能给 interface{}。 Go 里表达「可能没有值」更合适的是指针(string)或者 sql.NullString、time.Time 这种具体类型。工具不知道你的字段语义,只能给最宽的那个。同理,某个键只在部分记录里出现时,Go 那边拿到的是零值,和「真的等于零」区分不开——需要的话把这类字段自己改成指针。

三、时间字符串不会自动变成 time.Time。 自动识别要加 time 的 import,而且 JSON 里的时间格式不一定是 RFC3339(可能是 2026-10-05 14:23:11),猜错就编译不过。所以时间一律给 string,要转自己加。

重复字段名会自动加后缀:user_name 和 userName 都会转成 UserName,Go 不允许同名,第二个会变成 UserName2,页面上会提示一句。这不是工具在瞎编——它在告诉你 JSON 里本来就有两个键指同一件事。

omitempty 默认关着。它只影响序列化时要不要省略零值字段,不改变「这个键缺失」的语义。不确定就先别开。

全部在浏览器里完成,JSON 不会上传。

常见问题

生成的代码能直接编译吗?

能。每个类型都带 package 声明,字段名已避开 Go 保留字和数字开头。粘贴后在编辑器里 gofmt 一下格式会更标准。

为什么某个字段是 interface{}?

样本里这个字段出现过多种类型(比如有时字符串有时数字),或者值全是 null。Go 没有 union 类型,只能用最宽的 interface{}。

为什么长整数最后几位变了?

超过 2^53 的整数在 JSON.parse 那一步就失真了,任何 JS 工具都一样。这类 ID 请用字符串传递。

为什么时间字段是 string?

自动识别成 time.Time 需要 import,而且 JSON 里的时间格式不唯一,猜错就编译不过。要转 time 请自己加。

字段名能改成 Id 而不是 ID 吗?

可以,生成后手改。工具按 Go 社区惯例把 id、url、api 这类缩写全大写。

两个键都变成了同一个字段名?

它们的 JSON 键不同但转成 Go 后同名(如 user_name 和 userName),第二个会自动加数字后缀,建议你在 JSON 侧统一命名。

JSON 会上传吗?

不会,解析和生成都在浏览器里完成。

同类工具

编码解码 查看全部 ›