实用工具
输入
结果
结果会显示在这里。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