功能介绍
JSON 转 Go 工具读取一段 JSON 示例,生成带 json 标签的 Go 结构体定义,可以直接配合 encoding/json 使用。粘贴所调用接口的返回数据,就能得到马上可以传给 json.Unmarshal 的类型,不用手写每个字段和标签。
转换器会检查示例里的每一个值。嵌套对象生成独立的结构体,数组的所有元素合并成一个元素类型,部分元素缺失或有时为 null 的字段会被识别为可选。输出按照 gofmt 的格式对齐。
使用方法
- 把 JSON 粘贴到输入框、上传
.json文件,或点「示例」。 - 设置根类型名,选择嵌套对象的写法、哪些字段加
omitempty,以及可空字段是否使用指针。 - 复制 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 会被上传吗?
不会。结构体在浏览器中生成,不会发送到服务器。