GO

JSON 转 Go Struct

从样例推断嵌套 Go Struct、JSON Tag、Slice、指针与可选字段

JSON 与数据
🔒 100% 本地运行 — 你的数据不会离开当前页面
由 Evan 维护•最近更新:2026年9月30日
JSON → Go structs

根据样本推断,不是完整 API 契约。字段缺失与显式 null 分别推断,输出类型可能合并两者;数组内的 null 单独保留可空性。重复键和会改变数值的输入会报错。

上限:1 MiB、64 层、20,000 个值、200 个模型、2,000 个模型字段。精确大整数或金额请用字符串。

目标:Go 1.18+ 与 encoding/json。部分合法 JSON 键无法用 Go 标签表达,会明确报错。混合值使用 any。

Go structs

生成后请在目标项目编译,并用代表性响应验证反序列化。

工具说明

JSON 转 Go Struct 从一个对象或非空对象样本数组生成 Go 1.18+ 命名结构体与 encoding/json 标签。推断时分别记录字段缺失与显式 null:可空标量、对象及切片内可空元素使用指针,缺失字段指针选项控制多样本中观察到的缺失。混合值使用 any,仍需按应用契约确认类型。规范化后冲突的字段名和模型名会获得唯一后缀。并非所有 JSON 键都能用 Go 标签表达:空键、单个连字符、逗号、引号、反斜杠、反引号、控制字符和不支持的符号会报错,不会悄悄读取另一个字段。仅在确实希望省略 nil 或空值时开启 omitempty。输入在本地处理,上限为 1 MiB、64 层、20,000 个值、200 个模型与 2,000 个模型字段。重复键、未配对 Unicode 代理项、负零、不安全整数及转换后数值会改变的小数词法会被拒绝。精确 ID 或金额请使用字符串,并在目标模块编译及验证代表性响应。

场景配方

01

验证可空分数列表

目标:切片中 null 元素与零分保持区分。

  1. 粘贴 {"values":[1,null,2]},保持 omitempty 关闭。
  2. 生成 Go Struct,确认 Values 使用 []*int64。
  3. 使用 encoding/json 读入并重新编码,确认中间元素仍是 null。

结果:切片中 null 元素与零分保持区分。

失败门诊(高频踩坑)

反序列化后字段不见了

原因:Go 标签能够编译,并不表示 encoding/json 接受其名称。

修复:检查报错键;对不支持的名称自行映射,不要删除源键标点。

编码后字段被省略

原因:omitempty 会改变 nil 与空值是否出现的语义。

修复:开启前,用同时包含 null 和空切片的样本核对输出 JSON。

生产可用片段

数组中的 null 需要独立指针类型

go

// Input: {"values":[1,null,2]}
type ApiResponse struct {
    Values []*int64 `json:"values"`
}
// A nil element remains JSON null; it is not int64(0).

常见问题

为什么 [1, null, 2] 生成 []*int64?

null 位于数组元素中,不是字段缺失。整数指针可以表示数值或 nil,避免把 null 换成零。

为什么合法 JSON 键会被拒绝?

encoding/json 标签有自己的名称语法。超出此语法的键需要自行实现 UnmarshalJSON,本工具不生成该映射。

omitempty 会保留显式 null 和空切片吗?

不一定。对推断为缺失的字段,此选项可能在编码时省略 nil 或空值。需要输出这些值时保持关闭。

int64 是否表示支持所有 64 位 JSON 整数?

不是。浏览器推断会检查原数值词法,仅接受安全整数。更大的标识符应先作为字符串输入。

继续浏览