DevToolPal
简

JSON 转 Go 结构体

根据 JSON 示例生成带 json 标签的 Go 结构体,支持独立命名或内联的嵌套结构体和 omitempty。

本地处理,不上传

选项

嵌套对象

JSON

0 字符 · 0 B

Go

0 字符 · 0 B

功能介绍

JSON 转 Go 工具读取一段 JSON 示例,生成带 json 标签的 Go 结构体定义,可以直接配合 encoding/json 使用。粘贴所调用接口的返回数据,就能得到马上可以传给 json.Unmarshal 的类型,不用手写每个字段和标签。

转换器会检查示例里的每一个值。嵌套对象生成独立的结构体,数组的所有元素合并成一个元素类型,部分元素缺失或有时为 null 的字段会被识别为可选。输出按照 gofmt 的格式对齐。

使用方法

  1. 把 JSON 粘贴到输入框、上传 .json 文件,或点「示例」。
  2. 设置根类型名,选择嵌套对象的写法、哪些字段加 omitempty,以及可空字段是否使用指针。
  3. 复制 Go 代码或下载为 .go 文件,再加上 package 声明。

JSON 格式错误时会提示出错的行和列。

示例

这段 JSON:

{ "id": 7, "user_name": "ada", "tags": ["admin"], "profile": { "avatar_url": "https://example.com/a.png" } }

会生成以下结构体:

type Root struct {
	ID       int      `json:"id"`
	UserName string   `json:"user_name"`
	Tags     []string `json:"tags"`
	Profile  Profile  `json:"profile"`
}

type Profile struct {
	AvatarURL string `json:"avatar_url"`
}

小贴士

  • 一份示例只能体现它包含的内容。如果某个值可能是数字也可能是字符串,请两种都给出,或者把多份示例放进一个数组让它们合并。
  • 时间戳以字符串形式出现。如果格式是 RFC 3339,可以自己把类型改成 time.Time。
  • 字段完全相同的对象共用一个结构体,同样的结构在多处出现时输出也很简短。
  • 还要写 TypeScript?JSON 转 TypeScript 工具用同样的推断逻辑生成接口。

常见问题

› 字段名是怎么生成的?

每个 JSON 键会转换成 PascalCase 的导出 Go 名称,常见缩写按 golint 的要求全大写,所以 user_id 变成 UserID,avatar_url 变成 AvatarURL。原始键名保留在 json 标签里,encoding/json 能准确对应字段。

› 会用哪些 Go 类型?

字符串对应 string,整数对应 int(数值超出 32 位时用 int64),小数对应 float64,布尔值对应 bool。数组变成切片,空对象变成 map[string]any,只有 null 或混合多种类型的值变成 any。

› 独立命名结构体和内联结构体有什么区别?

命名模式把每个嵌套对象写成独立类型,比如 Address 或 Order,更方便复用和测试。内联模式把匿名结构体直接写在父结构体里,所有内容都在一个声明中,很多快速转换工具采用这种写法。

› 什么时候加 omitempty?

默认只给可选字段加,也就是数组中部分对象缺失或有时为 null 的字段。也可以给所有字段加或全部不加。打开指针选项,就能区分缺失、null 和零值。

› 我的 JSON 会被上传吗?

不会。结构体在浏览器中生成,不会发送到服务器。