JSON 至Go结构

下一个

粘贴 JSON 示例即可获取可被encoding/json清晰解析的Go结构体定义。字段会被导出(格式为CamelCase),保留原始 JSON 键标签;当值可能为空时会转换为指针类型;嵌套对象则拥有独立的命名结构体声明。

如何将 JSON 转换为 Go 结构体

  1. 1

    粘贴 JSON

    单个样本即可满足需求;使用多个样本可提升可缺失值推断的准确性。

  2. 2

    选择名称

    导出字段的 PascalCase 是 Go 语言的标准规范。请选择缩写格式(例如 `URL` 对比 `Url`,或 `ID` 对比 `Id`)。

  3. 3

    选择可选策略

    对于可为空字段,请使用指针(最符合规范)或`omitempty`标签。

  4. 4

    复制结构体

    一个根结构及嵌套结构。将其粘贴到 `.go` 文件中,然后选择 `go build`。

示例输出

对于以下输入:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

输出:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

类型映射

JSON 值 Go 类型
字符串 string
整数 intint64
数值(小数) float64
布尔值 bool
null(与非空值的兄弟项关联) *T(指针)
数组 []T
对象 带名称的结构体
混合数组 []interface{}

生成器遵循的命名惯例

  • 首字母大写idIDurlURLapi_keyAPIKey。此格式符合 Go 语言推荐的样式(以及 go vet/staticcheck 的规范要求)。
  • snake_case JSON → PascalCase 字段first_nameFirstName
  • 保留单字缩写形式IP保持为IPHTTP保持为HTTP
  • ** JSON 标签**:json:"first_name"保留原始键,确保编码与解码过程顺畅无误。

可选字段:指针还是 omitempty

策略 适用场景
指针(*T 需区分“缺失”与“零值”
omitempty 在序列化时仅需跳过零值;反序列化时会将缺失值存储为零
该字段始终存在,且零值具有实际意义

该生成器默认将所有被视为空值的内容标记为指针+omitempty;具体设置可根据您的语义需求进行调整。

常见错误

  • 在32位目标系统中,当 JSON 整数值超过MaxInt32时,请使用int;对于已知的大值,则使用int64
  • 重新编码会丢失键的顺序。 encoding/json按字段声明顺序输出键,而非原始 JSON 顺序。如需规范输出,请手动排序。
  • 混合结构数组。 []interface{}已失去类型安全性。建议改用带有type标识字段的联合类型。
  • 在可选字段中忽略 omitempty 若未使用该字段,可选字段将被序列化为 "foo": null 而非省略。

常见问题

当需要区分“字段为空”与“字段值为零”时,请使用指针;若零值不属于合法业务值,则使用 omitempty""0false 均表示“跳过该字段”)。多数团队会选择一种标准代码规范并在整个代码库中统一应用。

每个嵌套对象均会成为独立的命名结构体声明(例如 UserAddress)。仅当嵌套结构体体积极小且仅使用一次时,才将类型内联;否则可获得简洁且可复用的类型。

是的。id将变为IDurl将变为URLapi_key将变为APIKey。这正是go vet所要求的,也是大多数Go语言风格指南的推荐做法。

该生成器输出带有标准json:标签的普通结构体。对于自定义UnmarshalJSON实现(例如非ISO格式的日期数据),需在生成后手动添加相应标签。

相关工具

此工具还提供其他语言版本