开发者工具 · JSON / 数据格式

JSON 转 Go struct

含 tag/嵌套结构识别

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 129 次使用
JSON 输入数据
Go struct 含 tag · 类型推断 · 嵌套
Go struct 将在这里呈现 —— 点「示例」试试
就绪 · 左侧粘贴 JSON,自动推断类型并生成 Go struct,全程本地处理
第一节

关于本工具

About

后端工程师从 API 文档复制 JSON 到 Go 代码里,手写 struct 时最容易漏掉嵌套层级或 tag 标签。这个工具把 JSON 直接解析成带 json tag 的 struct 定义,嵌套对象和数组也能自动展开成对应的结构体。转换在浏览器内完成,原始 JSON 不会上传到任何服务器。

使用场景

壹

API 联调改字段

后端接口文档用 Go 定义了一个嵌套五层的 JSON 响应体,前端拿到手发现最内层字段名拼错了。改完文档后,前端需要把整个 JSON 结构重新解析为 Go struct 来跑 mock 数据。把修正后的 JSON 原文粘贴进工具,点一下就能拿到包含所有嵌套 tag 的 struct 定义,不用手写一层层 struct 和 json tag,联调能早半天结束。

贰

微服务配置迁移

运维需要把一套基于 JSON 的微服务配置(含 30 个服务、每个服务 10 个字段、部分字段是数组嵌套对象)迁移到 Go 的 Viper 配置加载体系。手动写 struct 容易漏掉某个服务的 optional 字段或写错 JSON tag 的 omitempty。把配置 JSON 全量复制进来,工具自动识别嵌套结构和 tag,生成的 struct 直接放入 config.go 文件,编译零报错。

叁

SDK 响应定义

第三方支付平台给的 API 文档只有一段 JSON 示例,没有 Go SDK。开发需要在 Go 项目里定义 OrderResponse、RefundResult 等 struct,里面涉及金额字段的 decimal 类型和状态码的枚举映射。把示例 JSON 逐段贴入工具,工具不仅生成 struct,还自动补上 json tag 和嵌套结构,省去对照文档逐层手写 struct 的枯燥工作。

肆

日志解析结构

线上日志以 JSON 格式输出,每条日志包含 timestamp、level、message 以及一个嵌套的 context 对象(含 requestId、userId、extra 字典)。需要写一个日志解析器把 JSON 日志反序列化到 Go struct 中。把一段典型日志 JSON 贴进去,工具直接输出带所有嵌套字段和 tag 的 struct 定义,连 context 里的 map[string]interface{} 类型也自动识别,不用手动推测字段类型。

伍

数据库迁移脚本

DBA 导出了一份 MySQL 表结构的 JSON 描述(字段名、类型、是否为空、默认值),需要转成 Go 的 GORM model 定义。把 JSON 贴进工具,生成的 struct 里字段名自动转为驼峰,json tag 保留原字段名,嵌套结构(如 JSON 字段中的子对象)也自动展开为嵌套 struct,直接复制到 model.go 里就能跑 migration。

第二节

使用指南

Getting Started

使用步骤

  1. 1在左侧输入框粘贴原始 JSON 文本,编辑器自动高亮语法并检测格式错误
  2. 2点击「转换」按钮,右侧即时生成对应 Go 结构体代码,嵌套结构自动展开为子类型
  3. 3查看输出区顶部「tag」开关,开启后每个字段自动追加 json 标签(如 `json:"name"`)
  4. 4点击结果区右上角「复制」图标,结构体代码写入剪贴板,可直接粘贴到 Go 源文件

输入输出示例

输入输出说明
{"name":"Alice","age":30,"active":true}type AutoGenerated struct { Name string `json:"name"` Age int `json:"age"` Active bool `json:"active"` }常规:基础字段类型(字符串、整数、布尔)的映射,验证 tag 生成与类型推断的正确性。
{"user":{"id":1,"profile":{"bio":"dev","tags":["go","json"]}}}type AutoGenerated struct { User struct { ID int `json:"id"` Profile struct { Bio string `json:"bio"` Tags []string `json:"tags"` } `json:"profile"` } `json:"user"` }常规:嵌套结构 + 数组字段,验证递归解析与多层嵌套 struct 的生成。
{"items":[{"x":1},{"x":2}]}type AutoGenerated struct { Items []struct { X int `json:"x"` } `json:"items"` }边界:数组内对象字段一致,验证工具能否正确推断出统一 struct 而非生成多个匿名结构。
{"empty":{},"null_val":null}type AutoGenerated struct { Empty struct{} `json:"empty"` NullVal interface{} `json:"null_val"` }边界:空对象和 null 值,验证工具对空结构体(struct{})和空接口(interface{})的处理策略。
{"id":12345678901234567890}type AutoGenerated struct { ID int64 `json:"id"` }边界:超 int32 范围的整数,验证工具是否自动选择 int64 而非 int(避免溢出)。
{"score":3.14,"big":1.2345678901234567}type AutoGenerated struct { Score float64 `json:"score"` Big float64 `json:"big"` }易错:浮点数精度,验证工具是否统一用 float64(而非 float32),避免高精度值被截断。
{"data":"2023-01-01T00:00:00Z"}type AutoGenerated struct { Data string `json:"data"` }易错:日期字符串不会被自动识别为 time.Time,验证工具保持原字符串类型而非过度推断(多数工具不做语义解析)。

常见错误对照

1.JSON 末尾多逗号,解析直接失败

✗ 错误{"name":"Alice","age":30,}
✓ 修复{"name":"Alice","age":30}

JSON 标准(RFC 7159)明确禁止末尾逗号。Go 的 encoding/json 严格遵循标准,遇到尾部逗号直接报错,不会自动忽略。

2.键名用单引号,Go 无法识别

✗ 错误{'name':'Bob','score':95}
✓ 修复{"name":"Bob","score":95}

JSON 规范要求键名必须用双引号。单引号是 JavaScript 对象字面量写法,Go 标准库解析时直接返回语法错误。

3.数字带前导零,被当成八进制解析

✗ 错误{"id":0123}
✓ 修复{"id":123}

JSON 数字不允许前导零(除非小数部分)。Go 的 json.Unmarshal 遇到 0123 会报错,因为 0123 在 JSON 里不是合法数字字面量。

4.JSON 里写注释,Go 解析直接崩溃

✗ 错误{"name":"Tom" /* 这是注释 */}
✓ 修复{"name":"Tom"}

JSON 标准不支持注释。Go 的 encoding/json 遇到注释直接报错,不会像某些解析器(如 Python json5)那样宽容。

5.字符串内未转义换行,导致解析中断

✗ 错误{"desc":"第一行 第二行"}
✓ 修复{"desc":"第一行\n第二行"}

JSON 字符串中不允许出现字面换行符。必须用 \n 转义,否则解析器在换行处认为字符串结束,引发语法错误。

6.嵌套结构未提供完整路径,生成 struct 缺少层级

✗ 错误输入 {"a":{"b":1}} 只期望生成 type A struct { B int }
✓ 修复输入 {"a":{"b":1}} 期望生成 type A struct { B struct { C int } `json:"b"` }

工具会递归识别嵌套对象,每个层级生成独立 struct。如果只写外层字段,会丢失内层结构定义,导致反序列化时内层字段被忽略。

第三节

工作原理

How It Works

核心公式

GoStruct = TypeName + struct { Fields }

变量说明

  • TypeNameGo 结构体名称,如 User
  • Fields字段列表,含名、类型、标签

示例

输入 JSON:{"name":"张三","age":30,"tags":["go","json"]},工具识别 name 为 string、age 为 float64、tags 为 []string,生成 Go 结构体:type AutoGenerated struct { Name string `json:"name"` Age float64 `json:"age"` Tags []string `json:"tags"` }。嵌套结构同理,如 {"user":{"name":"李四"}} 生成 type AutoGenerated struct { User struct { Name string `json:"name"` } `json:"user"` }。

原始 JSON含嵌套结构解析器逐层拆解识别 tag 与嵌套Go struct类型定义代码复制使用关键处理逻辑1. 解析 JSON 顶层字段类型(string / number / object / array)2. 遇到 object 类型 → 递归进入子层级,生成嵌套 struct3. 提取字段名并转换为 Go 导出命名规则,附加 json tag
用户输入 本地处理 输出结果 操作节点
第五节

常见问题

Q & A
问我有一段 JSON 里面嵌套了好几层,这个工具能一次性全转成 Go struct 吗?+
答

可以。本工具会自动识别 JSON 中的嵌套对象和数组,并生成对应的嵌套 struct 定义。例如,如果 JSON 里有一个 address 对象包含 city 和 street,工具会生成 Address struct,然后在主 struct 中用 `Address json:"address"` 引用。不需要手动拆分层级,一次性输入完整 JSON 即可递归转换。

问JSON 里字段名是下划线风格(snake_case),生成的 Go 字段名能自动变成驼峰吗?+
答

能。工具默认将 JSON 的 snake_case 字段名转为 Go 的 PascalCase(大驼峰),并自动生成对应的 json tag。例如,user_name 转为 UserName `json:"user_name"`。如果你希望字段名保持原样,可以在界面勾选「保留原始字段名」选项,工具会跳过驼峰转换,直接使用 JSON 中的字段名作为 Go 字段名。

问转换出来的 struct 里字段类型是 float64,但我想要 int 怎么办?+
答

工具默认将 JSON 中的数字统一推断为 float64,因为 JSON 标准不区分整数和浮点数。如果你确定某个字段永远是整数,可以在转换后手动将类型改为 int 或 int64。本工具暂不支持在转换时指定类型偏好,但你可以先在 JSON 中将该字段值改为带小数点的形式(如 123.0),工具会保留为 float64;如果值不带小数点,仍会推断为 float64,需要手动修正。

问JSON 里有空数组 [],生成的 Go 类型是什么?+
答

空数组 [] 会被推断为 `[]interface{}`,因为工具无法从空数组中确定元素的具体类型。建议你先在 JSON 中填充一个示例元素,例如将 [] 改为 [1],工具就能正确推断为 `[]int`。如果无法修改源数据,转换后需要手动将 `[]interface{}` 替换为预期的切片类型(如 `[]string`),否则后续代码中取值需要类型断言。

问这个工具会不会把我的 JSON 上传到服务器?我处理的是敏感数据。+
答

不会。本工具完全在浏览器本地运行(纯前端实现),你粘贴的 JSON 不会离开你的设备。所有解析和 struct 生成逻辑都由 JavaScript 在浏览器内执行,无需网络请求。你可以断开网络测试:粘贴 JSON 后点击转换,结果依然正常生成。因此,即使包含 API Key、密码等敏感字段,也不会被上传。

问为什么我粘贴了一个很大的 JSON(几千行),点击转换后浏览器卡住了?+
答

本工具在浏览器本地解析,极端大的 JSON(如超过 1MB 或嵌套超过 10 层)可能导致页面短暂无响应,因为解析和生成 struct 是同步操作。建议分段处理:将大 JSON 拆成多个独立对象分别转换,或使用在线 JSON 压缩工具缩小体积后再粘贴。如果卡住超过 5 秒,可以刷新页面重试,但注意已输入的内容会丢失。

问JSON 里字段名有特殊字符(比如空格、@符号),能正常转吗?+
答

可以转换,但 Go 字段名中不允许包含特殊字符,工具会将这些字符替换为下划线或删除。例如,`user name` 会转为 `User_Name`,`@id` 会转为 `Id`。生成的 struct 中,json tag 会保留原始字段名(如 `json:"user name"`),保证序列化/反序列化时能正确匹配。如果特殊字符过多,建议先在 JSON 中清理字段名,避免生成的 struct 可读性差。

问这个工具和在线 JSON 转 Go struct 网站(比如 json-to-go)有什么区别?+
答

核心转换逻辑类似,但本工具有两个差异点:第一,支持嵌套结构识别并自动生成独立 struct,而不是将所有嵌套内联展开;第二,完全离线运行,不依赖后端服务,而部分同类网站需要将数据发送到服务器处理。此外,本工具额外提供「保留原始字段名」选项和更清晰的字段类型提示,适合需要精细控制输出格式的用户。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭