API 联调改字段
后端接口文档用 Go 定义了一个嵌套五层的 JSON 响应体,前端拿到手发现最内层字段名拼错了。改完文档后,前端需要把整个 JSON 结构重新解析为 Go struct 来跑 mock 数据。把修正后的 JSON 原文粘贴进工具,点一下就能拿到包含所有嵌套 tag 的 struct 定义,不用手写一层层 struct 和 json tag,联调能早半天结束。
开发者工具 · JSON / 数据格式
含 tag/嵌套结构识别
Go struct 将在这里呈现 —— 点「示例」试试后端工程师从 API 文档复制 JSON 到 Go 代码里,手写 struct 时最容易漏掉嵌套层级或 tag 标签。这个工具把 JSON 直接解析成带 json tag 的 struct 定义,嵌套对象和数组也能自动展开成对应的结构体。转换在浏览器内完成,原始 JSON 不会上传到任何服务器。
后端接口文档用 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 文件,编译零报错。
第三方支付平台给的 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。
| 输入 | 输出 | 说明 |
|---|---|---|
| {"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。如果只写外层字段,会丢失内层结构定义,导致反序列化时内层字段被忽略。
GoStruct = TypeName + struct { Fields }
TypeNameGo 结构体名称,如 UserFields字段列表,含名、类型、标签输入 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 中的嵌套对象和数组,并生成对应的嵌套 struct 定义。例如,如果 JSON 里有一个 address 对象包含 city 和 street,工具会生成 Address struct,然后在主 struct 中用 `Address json:"address"` 引用。不需要手动拆分层级,一次性输入完整 JSON 即可递归转换。
能。工具默认将 JSON 的 snake_case 字段名转为 Go 的 PascalCase(大驼峰),并自动生成对应的 json tag。例如,user_name 转为 UserName `json:"user_name"`。如果你希望字段名保持原样,可以在界面勾选「保留原始字段名」选项,工具会跳过驼峰转换,直接使用 JSON 中的字段名作为 Go 字段名。
工具默认将 JSON 中的数字统一推断为 float64,因为 JSON 标准不区分整数和浮点数。如果你确定某个字段永远是整数,可以在转换后手动将类型改为 int 或 int64。本工具暂不支持在转换时指定类型偏好,但你可以先在 JSON 中将该字段值改为带小数点的形式(如 123.0),工具会保留为 float64;如果值不带小数点,仍会推断为 float64,需要手动修正。
空数组 [] 会被推断为 `[]interface{}`,因为工具无法从空数组中确定元素的具体类型。建议你先在 JSON 中填充一个示例元素,例如将 [] 改为 [1],工具就能正确推断为 `[]int`。如果无法修改源数据,转换后需要手动将 `[]interface{}` 替换为预期的切片类型(如 `[]string`),否则后续代码中取值需要类型断言。
不会。本工具完全在浏览器本地运行(纯前端实现),你粘贴的 JSON 不会离开你的设备。所有解析和 struct 生成逻辑都由 JavaScript 在浏览器内执行,无需网络请求。你可以断开网络测试:粘贴 JSON 后点击转换,结果依然正常生成。因此,即使包含 API Key、密码等敏感字段,也不会被上传。
本工具在浏览器本地解析,极端大的 JSON(如超过 1MB 或嵌套超过 10 层)可能导致页面短暂无响应,因为解析和生成 struct 是同步操作。建议分段处理:将大 JSON 拆成多个独立对象分别转换,或使用在线 JSON 压缩工具缩小体积后再粘贴。如果卡住超过 5 秒,可以刷新页面重试,但注意已输入的内容会丢失。
可以转换,但 Go 字段名中不允许包含特殊字符,工具会将这些字符替换为下划线或删除。例如,`user name` 会转为 `User_Name`,`@id` 会转为 `Id`。生成的 struct 中,json tag 会保留原始字段名(如 `json:"user name"`),保证序列化/反序列化时能正确匹配。如果特殊字符过多,建议先在 JSON 中清理字段名,避免生成的 struct 可读性差。
核心转换逻辑类似,但本工具有两个差异点:第一,支持嵌套结构识别并自动生成独立 struct,而不是将所有嵌套内联展开;第二,完全离线运行,不依赖后端服务,而部分同类网站需要将数据发送到服务器处理。此外,本工具额外提供「保留原始字段名」选项和更清晰的字段类型提示,适合需要精细控制输出格式的用户。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。