跳到主内容
UniKit

JSON 转 Go 结构体

JSON 自动生成 Go struct 定义

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

选项
生成的 Go 代码
package main

type RootOwner struct {
	Name string `json:"name"`
	Email interface{} `json:"email"`
}

type RootItems struct {
	Sku string `json:"sku"`
	Price float64 `json:"price"`
	Note *string `json:"note"`
}

type Root struct {
	ID int64 `json:"id"`
	Name string `json:"name"`
	IsActive bool `json:"is_active"`
	Score float64 `json:"score"`
	Owner RootOwner `json:"owner"`
	Tags []string `json:"tags"`
	Items []RootItems `json:"items"`
	Meta interface{} `json:"meta"`
}

结果摘要: 类型数 3 · 字段数 13 · 命名冲突 0

这个工具能做什么

  • 对接第三方 API 时把返回的 JSON 样例粘进来,直接得到带 json tag 的 Go struct,不用再一个个字段手敲。
  • 需要区分「JSON 里没有这个键」和「值是零值」时,可选字段会生成指针类型(*int64、*string),往返序列化不丢信息。
  • 接口字段命名不规范(kebab-case、含 ID / URL 这类缩写)时,用命名约定加 Go 缩写惯例生成符合社区习惯的导出字段名。
  • 确认 encoding/json 能正常读写:Go 要求字段首字母大写才导出,这里生成的字段名一律大写,原始 JSON 键保留在 tag 里。

示例

输入

{"id":1,"name":"UniKit","tags":["a","b"]}

输出

package main

type Root struct {
	ID int64 `json:"id"`
	Name string `json:"name"`
	Tags []string `json:"tags"`
}

类型完全由 JSON 推断:数组元素同构写成 []string,异构会退化成 []interface{};值为 null 或只在部分数组元素里出现的字段用指针表达。

常见问题

为什么 id 生成的字段名是 ID 而不是 Id?

Go 社区惯例把常见缩写写成全大写,这里内置了 id、url、api、json、http、uuid 等词的映射。不喜欢这套风格就把命名约定换成 snake_case 或 kebab-case,缩写就不会被改写。

为什么有的字段是 *int64 而不是 int64?

指针出现在两种位置:该键在部分数组元素里是 null(例如 [{"a":1},{"a":null}] 得到 *int64),或者该键只在部分数组元素里出现(*int64)。如果这个键在所有样例里都只是 null,没有任何类型线索,字段会退化成 interface{} 而不是指针。切片、map 和 interface{} 本身就能为 nil,也不会再加指针。

数组里的对象结构不一致会怎样?

字段名取所有元素的并集,只出现在部分元素里的字段变成指针类型;如果同一个键在不同元素里类型不同(例如一个是数字一个是字符串),该字段退化成 interface{}。

根节点是数组或标量可以吗?

根节点是对象或对象数组都能生成,根结构体名取你填的那个(默认 Root)。根节点是数字、字符串、null 这类标量会直接报错,因为推不出结构体。

我的 JSON 会被上传吗?

不会。解析与代码生成全部在浏览器里用 JavaScript 完成,页面不发送任何网络请求,断网状态下同样可用。

关键词:jsongogolangstructjson tagsjson to goJSON 转 Go结构体golang 结构体代码生成

同类工具