跳到正文

JSON 转 Go 结构体

JSON to Go Structs

从 JSON 样例生成带 json tag 的 Go 结构体,嵌套和重复出现的类型都能处理。

从一份样例文档生成带 `json:` tag 的 Go 结构体,让响应体变成 `encoding/json` 能 unmarshal 进去的东西。字段名导出并转成驼峰,原始键保留在 tag 里——手写时出错的正是这一处。

🔒 完全在你的浏览器里运行gojsoncodegenstruct
生成语言

示例 JSON

拖入 .json 文件

在这个标签页里读取,不上传。

手上有几条就全放进来。每多一条记录,推断就更收紧一点——某条里缺了的字段,正是它被判成可选的依据。

TypeScript

怎么用

  1. 有多少条记录就粘贴多少

    每个数组的每个元素都会被读取并合并,不只是第一个。三条记录告诉它的远比一条多,因为某个字段在其中一条里缺失,正是让那个字段变成可选的依据。

  2. 给根类型起名

    嵌套对象按持有它的键命名,数组会转成单数,所以 `users` 得到 `User`。只有根需要你起名。

  3. 读输出下方的计数

    类型数、可选字段数、联合类型数,以及合并了多少条记录。联合类型计数大于零,说明某个字段在你的样本里出现过两种不同的值——把结果粘进代码库之前值得看一眼。

  4. 把结构体粘进某个包

    在部分记录里缺失的字段,tag 里会带 `,omitempty`,这样 marshal 一个来回不会凭空造出它们。不输出 package 子句——它要去哪儿你自己知道。

常见问题

为什么所有数字都是 `float64`?

只在样本里出现过小数时才会这样。如果文档里每个数字都是整数,字段就输出为整数类型。没有办法区分作为 id 的 JSON `1` 和作为舍入后价格的 JSON `1`,所以样本就是全部的证据。

在部分记录里是 null 的字段呢?

它会变成指针类型,这是 Go 区分「缺失或 null」和「零值」的方式。也就是说解引用前需要判 nil——麻烦,但另一种做法(一个悄悄读成 0 或 "" 的普通值)更糟。

键不是合法的 Go 标识符怎么办?

字段名会被整理——去掉分隔符,每一段首字母大写——原始键留在 `json:` tag 里,真正做匹配的是它。`user-id` 这样的键会变成 `UserID` 之类,旁边带着 `json:"user-id"`。

会生成 `time.Time` 字段吗?

不会。JSON 里的时间戳是字符串,把它变成 `time.Time` 会改变 unmarshal 能接受的输入。如果你要这样,手工改字段类型——`encoding/json` 自己就能把 RFC 3339 解析成 `time.Time`。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。