实用工具

JSON 转 Go 结构体

把 JSON 转成带 json tag 的 Go struct:可空字段用指针,时间戳用 time.Time。

浏览器本地运行代码转换1.4万
免费

输入

0 B

结果

结果会显示在这里。

encoding/json 要反序列化一段数据,得先有对应的结构体:字段名要符合 Go 的命名习惯,还要用 json tag 映射回原来的键。这里用 quicktype 的 Go 生成器从样本自动生成:stargazers_count 变成 StargazersCount 并带上 json:"stargazers_count",嵌套对象生成独立命名的结构体,有时为 null 的字段变成指针,这样 null 和零值才能区分开。输出以 package 声明和所需的 import 开头,是一个完整的 Go 文件;放进项目时把 package main 改成你自己的包名即可。

它是怎么工作的

  • 字段名遵循 Go 的缩写惯例,id 变成 ID,html_url 变成 HTMLURL,和 lint 工具的要求一致。
  • 所有样本里都是整数的数字生成 int64,只要出现一个小数,这个字段就变成 float64。
  • RFC 3339 时间戳生成 time.Time,encoding/json 不用写额外代码就能解析;关掉日期识别则保留为 string。
  • 打开 omitempty 会给每个 tag 加上 ,omitempty,结构体再序列化成 JSON 时零值字段会被省略。

你的数据去了哪里

哪也没去。本工具完全在你的浏览器里运行:你粘贴的文本由页面处理,不会传输到任何服务器,也不会写进任何日志。

本工具免费且无需登录,运行结果只存在于你当前的页面里,不会被保存到任何地方。

它要花多少

本工具完全免费,不需要登录,也不消耗积分。

常见问题

为什么有些字段是指针?
Go 用指针来区分“不存在或为 null”和零值。示例数据里的 homepage 在一个仓库里是字符串、在另一个里是 null,所以生成 *string。如果用普通 string,null 会被读成空字符串,两种情况就再也分不清了。
为什么有的字段是 interface{}?
样本里这个字段的值全是 null,推断不出类型,只好用能接收任何值的 interface{}。知道真实类型后手动替换,或者补一个该字段有值的样本重新生成即可。
和 mholt/json-to-go 是一回事吗?
做的是同一件事——Matt Holt 的 json-to-go 是这类工具的老牌网页版——但这里的引擎是 quicktype,它会把相同结构合并成一个 struct,并通过比较数组元素标出可选字段。两者输出风格很接近,放进同一个项目不会显得突兀。
要不要开 omitempty?
只有当“空值就等于不传”时才开。开了之后 false、0 和空字符串在序列化时都会消失,如果对方接口区分 false 和缺失,就会误读你的请求。只用于反序列化的结构体,这个 tag 没有任何影响。

背后的开源项目

本工具运行在 glideapps/quicktype 之上,以 Apache-2.0 许可发布。如果你需要在自己的程序里实现同样的能力,直接用这个库。

glideapps/quicktype

也常被称作

  • json转go
  • json转go结构体
  • json转struct
  • golang结构体生成
  • go json tag
  • 在线json转golang