JSON 转 Go struct, 粘 JSON 出带 json tag 的结构体, 字段自动导出, 嵌套对象生成子 struct, 可空字段用指针, 支持 int64 与 omitempty。
- 本地处理
- 分类 开发运维
- 适合 格式化、校验、压缩或检查和代码相关的文本。
类型、tag 和指针是怎么推断的
每个 JSON 对象生成一个命名 struct, 字段全部导出 (首字母大写), 每个字段带 `json:"key"` tag, 让 encoding/json 用你原始的 key 收发。整数推断成 int (或 int64); 带小数的推断成 float64; 一个数字有时是整数有时带小数, 字段会放宽到 float64。对象数组会折叠成一个 struct —— 某些元素缺的 key 会被当成可空 (开启"指针"时用 *T)。只出现过 null 的值推断成 interface{}。开启 ,omitempty 后空值 / 零值在 marshal 时会被省略。
这个工具能做什么
把任意 JSON (GitHub API 响应、Stripe webhook、Kubernetes manifest、 配置文件) 粘进来, 拿到一组带 `json:"field"` tag 的 Go `struct` 声明, 可以直接拖进 `.go` 文件。每个字段都是导出的 (首字母大写), 这样 `encoding/json` 才能读写它; snake_case 的 key 会转成符合 Go 习惯的 CamelCase, 而 `ID`、`URL`、`HTTP`、`API` 这类约定俗成的缩写会保持 全大写, 正是 golint 和 staticcheck 想要的样子。数字不会被一锅端: 整数样本推断成 `int` (打开开关则 `int64`), 带小数的推断成 `float64`, 一个字段有时是整数有时带小数时会放宽到 `float64`, 避免 unmarshal 时炸掉。对象数组会折叠成一个 struct, 所以 `[{"a":1},{"a":1,"b":2}]` 出来是一个同时带两个字段的类型, 而不是两个几乎重复的 struct。某些数组元素里缺的 key (或值为 null) 会被当成可空: 打开"指针"它们变成 `*T`, 不打开就用 Go 的零值兜底。 一个开关给所有 tag 加上 `,omitempty`, 方便你反向 marshal。 根 struct 名可改, 输入和选项能拼成链接分享, 输出可一键复制或下载 `.go` 文件。全部在浏览器里跑: JSON 不碰服务器。
工具细节
- 输入
- 文本 + 数值 + 结构化内容
- 页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
- 输出
- 即时结果 + 复制 + 下载
- 结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
- 隐私
- 浏览器本地处理
- 主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
- 保存 / 分享
- 可分享链接状态
- 关键设置会进入 URL,复制链接后别人能复现同一组参数。
- 性能预算
- 首屏 JS ≤ 25 KB
- 没有声明 WASM 依赖,适合快速打开和移动端使用。
- 适用场景
- 开发运维 · 程序员
- 分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。
怎么用
-
1. 输入
把内容粘贴或拖入工具面板。
-
2. 处理
点击按钮,在浏览器内本地处理,文件不上传。
-
3. 复制 / 下载
一键复制结果或下载到本地。
JSON 转 Go 结构体 适合怎么用
适合穿插在写代码、查问题、做 Review、上线前的小任务里。
适合开发场景
- 格式化、校验、压缩或检查和代码相关的文本。
- 把片段整理好再放进文档、工单、提交或交接材料。
- 不切换工具,快速检查一个小 payload。
开发检查项
- 压缩、混淆这类不可逆处理,先对副本操作。
- 除非确认工具本地处理,不要粘贴密钥和敏感片段。
- 转换后的代码上线前,仍要跑自己的测试或 lint。
下一步可以接着做
这些入口会把当前任务接到更完整的工具链里。
- 1 JSON 转 TypeScript Interface JSON 转 TypeScript interface, 粘 JSON 出干净 interface, 数组元素合并为 union, 可选字段自动识别, 根类型名可命名。 打开
- 2 TypeScript 转 Zod Schema TypeScript interface / type 转 Zod schema, 支持 union / 可选 / 嵌套 / 泛型 / enum / Record / Map / Set, 一键拷贝即用。 打开
- 3 JSON 转 Python Dataclass JSON 转 Python, 粘 JSON 出 @dataclass 或 Pydantic v2 模型, 带类型注解, Optional 推断, 嵌套子类, 字段转 snake_case 并保留别名。 打开
真实使用场景
接第三方 API 时不再手写结构体
你在接 GitHub API, user 对象有 30 多个字段。curl 一次拿到响应, 粘进来, 根名设为 `GitHubUser`, 复制输出到 `internal/github/types.go`。嵌套的 `plan` 对象自动抽成 `GitHubUserPlan`, `html_url` 变成 `HTMLURL` 并带正确的 tag。 现在 `json.Unmarshal(body, &u)` 填进一个完全类型化的 struct, 而不是一个到处要做类型断言的 `map[string]interface{}`。
给新 endpoint 生成请求 / 响应 DTO
同事发来他在做的 `/orders` POST 的一个 JSON body 样例。粘进来, 根名 `CreateOrderRequest`, 打开 `,omitempty` 让可选字段不撑大 marshal 出的 payload。响应样例也粘进来命名 `CreateOrderResponse`。 两个结构体, tag 齐全, 在你们任何一方写 handler 之前就提交进 `api/dto.go`。
给可空的 webhook payload 决定用指针还是值
某第三方的 webhook 有时带 `cancelled_at`, 有时不带。把前几次 payload 记下来, 作为 JSON 数组粘进来, 可选字段识别会标出 `cancelled_at`。打开"指针"它变成 `*string`, 这样在 handler 里 `if e.CancelledAt != nil` 就能干净地区分"已取消"和"仍有效": 不用再猜一个空字符串到底是不是"没发"。
把 map[string]interface{} 迁移成真正的类型
老代码是 `var data map[string]interface{}`, 然后用 `data["user"].(map[string]interface{})["id"].(float64)` 一层层 挖。抓一个有代表性的响应粘进来, 生成结构体, 替换掉 map。 那些坑过你的 `.(float64)` 断言 (JSON 数字解进 `interface{}` 会变 float64) 消失了: `int` 和 `float64` 现在在字段层面就 推断好了。
给 Go 服务做 fixture 和配置类型
你的服务读一个 `config.json`。粘进来, 根名 `Config`, 拿到 `Config`、`ConfigServer`、`ConfigServerTLS` 嵌套结构体, 端口是 `int`, 开关是 `bool`。放进 `config.go`, 写 `json.NewDecoder(f).Decode(&cfg)`, 配置在编译期就被类型检查, 而不是运行时因为一个拼错的 key 才挂。
常见踩坑
粘一个对象进来然后期待某些字段是可选的。单个对象没有"key 缺失"信号, 所以所有字段都是必需。可选 / 指针推断只在"多个对象组成的数组"里生效 (有的元素带某个 key、有的不带)。想从一个样本探索可选性, 把它包成 `[{...}]`。
给一个 0 / false / 空值有真实含义的字段开 ,omitempty。开了 omitempty, 一个你设成 0 的 `Count int` 在 marshal 出的 JSON 里直接不出现: 接收方分不清"count 是 0"还是"压根没发 count"。真需要这个区分时, 用指针 (`*int`) 加 omitempty。
以为 ID 一定该用 int64。如果你的 ID 是 JSON *字符串* (Stripe 的 `cus_123`、很多 UUID API), 它们会被推断成 `string` 而不是 int64, 这是对的。int64 只适用于数字型 JSON 值。别手动把一个字符串 ID 改成 int64, 会让 unmarshal 崩。
把一个只出现过 null 的字段当成有类型的字段。`{"meta": null}` 出来是 `Meta interface{}`, 因为 null 不带类型信息。如果你知道真实形状, 喂一个非 null 样本 (`{"meta": {"k": 1}}`), 工具才能推出像样的 struct。
粘 JSON5 / 带注释的 JSON / 末尾逗号。我们用严格的 `JSON.parse`, 注释、不带引号的 key、末尾逗号都会报错。先剥掉, 或者先过一道 JSON 格式化工具。
隐私说明
你粘进来的 JSON 不会离开这个浏览器标签页。解析和类型推断走浏览器 内建的 `JSON.parse`, 没有任何网络请求, 也不对文本框内容做 analytics。 分享链接会把你的输入和选项编码进 URL 以便复现结果, 也就是说由你 决定何时分享。如果 payload 敏感 (内部 ID、客户数据、生产响应), 直接复制生成的 Go 代码, 不要分享链接。只有选项布尔值 (指针 / omitempty / int64) 会存进 localStorage, 让你偏好的风格在多次访问 之间保留。
常见问题
类似工具组合
做你这行的人, 还会一起用这些。