logo
GeekFormat

JSON 转 Go

把 JSON 粘贴到左侧,右侧自动生成可直接用于 Go 项目的 struct 类型定义。纯浏览器本地处理,无需注册或上传。

相关推荐

关于 JSON 转 Go:把 JSON 变成 Go 的强类型 struct

JSON 转 Go 是把 JSON 格式的数据自动转换为 Go 语言 struct 类型定义的过程。JSON 是 REST API、配置文件、消息队列和日志中最常见的数据交换格式,而 Go 是一门强类型语言,开发中经常需要把 JSON 的动态结构映射为 struct 才能用 encoding/json 进行反序列化。手写 struct 尤其是嵌套对象时容易漏字段或写错类型,这个工具就是要把重复劳动自动化。

Go 的 struct 是复合数据类型,用 `type Name struct { ... }` 声明。每个字段由名称和类型组成,字段名必须大写开头才能被其他包访问,也就是所谓「可导出标识符」。工具会自动把 JSON 的字段名转为 PascalCase 的导出字段名,例如 `user_name` 会映射为 `UserName`,并保留原始 key 在 json 标签中。

本工具的核心转换由浏览器内的 jsonFormat Web Worker 完成,调用 quicktype-core 的 Go 渲染器并传入 `just-types` 与 `no-comments` 选项。整个流程不依赖后端服务:输入的 JSON 在本地解析、推断类型、生成 Go 代码,最后呈现到右侧编辑器中。

类型推断遵循 JSON 到 Go 的常规映射:字符串映射为 `string`、布尔映射为 `bool`、整数映射为 `int64`、浮点数映射为 `float64`、数组映射为切片 `[]T`、对象映射为独立的 struct、`null` 映射为 `interface{}`。嵌套对象会递归处理,保持层级关系清晰。

与手动编写相比,工具生成的代码是一份「可运行的初稿」。开发者通常只需要微调根类型名、包名、字段类型精度(如 int64 改 int)以及是否使用指针类型,就可以放进真正的 Go 项目中。配合一键复制和 model.go 下载,可以显著减少联调和建模阶段的重复工作。

适用场景

  • Go 后端开发把 REST API 响应 JSON 转成 struct,直接用 json.Unmarshal 绑定到 Gin/Echo/Fiber handler 的入参
  • 前后端联调时拿到 Postman 里的示例响应 JSON,快速生成 Go model 减少手写字段
  • 对接第三方 Webhook 回调时,把 payload JSON 转成 Go struct 方便字段级访问与校验
  • 把 Viper/Consul/Nacos 里的 JSON 配置文件转成 Go 类型,替代 map[string]interface{} 的弱类型访问
  • 微服务团队统一定义 gRPC/HTTP 接口的请求响应结构,把示例 JSON 转成共享的 Go 类型
  • 测试工程师把 JSON fixture 转成 Go struct,配合 testify 做断言驱动测试
  • 运维人员解析 ELK/Fluentd 收集的 JSON 日志行,生成 struct 后用 Go 程序做结构化分析
  • 爬虫抓取到 JSON 数据后转成 Go struct,配合 gorm/gen 或 ent 生成数据库模型
  • IoT 设备上报的 JSON 遥测数据转成 Go struct,在边缘网关程序中做反序列化与过滤
  • 把 Kafka/NATS/RabbitMQ 消费的 JSON 消息转成 Go 类型,用于事件驱动的消费者实现
  • SDK 开发者把服务端示例响应 JSON 转成 Go struct,写入 client 库的 types 包供用户引用
  • 把 Swagger/OpenAPI 文档中的示例 JSON 转成 Go struct,作为接口文档代码示例
  • 学生或讲师在 Go 课程中把示例 JSON 转成 struct,演示 Go 的类型系统与 json 标签用法
  • 数据迁移脚本把 MySQL/PostgreSQL 导出的 JSON 行转成 Go struct,做字段映射与类型校验
  • CI/CD 配置 JSON 转 Go struct,方便在 Go 编写的流水线工具里强类型读取配置
  • 老项目中把基于 map 动态读取的 JSON 代码重构为基于 struct 的强类型访问

使用方法

  1. 在左侧编辑器粘贴 JSON 内容,或拖拽上传 .json/.txt 文件,也可以点击「示例」加载内置数据。
  2. 等待约 400ms,工具会自动转换并在右侧显示生成的 Go struct 代码。
  3. 如果 JSON 报错,点击「修复 JSON」按钮自动修正常见格式错误后继续生成。
  4. 检查右侧输出,点击「复制」粘贴到 Go 项目,或点击「下载」保存为 model.go 文件。

功能特点

  • 浏览器本地生成 Go struct:JSON 解析与 Go 代码生成在浏览器内完成,原始数据不上传服务器
  • 400ms 防抖自动转换:粘贴或修改后无需手动点击,右侧实时输出可复制的 Go 代码
  • 智能类型推断:字符串映射为 string、布尔映射为 bool、整数映射为 int64、浮点映射为 float64、数组映射为切片、对象映射为 struct
  • 嵌套对象自动展开:递归生成独立 struct 类型,保持 JSON 层级关系清晰
  • 自动生成 json 标签:字段后附带 `json:"原始字段名"` 标签,可直接配合 encoding/json 使用
  • JSON 错误一键修复:自动处理尾随逗号、单引号、缺引号等常见格式错误,修复后继续生成
  • 支持粘贴/上传/示例三种输入:可拖拽上传 .json/.txt 文件,或加载内置中文示例
  • 一键复制与下载:复制整段 Go 代码到剪贴板,或下载为 model.go 文件直接放入项目
  • localStorage 输入历史:自动保存最近输入,刷新或误关页面后可快速恢复
  • 响应式分屏编辑器:左右面板宽度可调,桌面和移动端都能舒适查看输入与输出

代码示例

用生成的 struct 反序列化 JSON

go

把工具生成的 struct 复制到项目后,可直接用 encoding/json 反序列化 API 响应。

package main

import (
    "encoding/json"
    "fmt"
)

// 以下代码由 GeekFormat JSON 转 Go 工具生成
type User struct {
    ID      int64    `json:"id"`
    Name    string   `json:"name"`
    Tags    []string `json:"tags"`
    Address Address  `json:"address"`
}

type Address struct {
    City string `json:"city"`
}

func main() {
    data := []byte(`{
        "id": 1,
        "name": "Alice",
        "tags": ["admin", "dev"],
        "address": {"city": "Beijing"}
    }`)

    var u User
    if err := json.Unmarshal(data, &u); err != nil {
        panic(err)
    }

    fmt.Println(u.Name, u.Address.City)
}

处理字段可能缺失的 JSON

go

如果 API 某些字段可能不存在,可把对应字段改为指针类型或配合 omitempty 标签使用。

package main

import "encoding/json"

// 手动将字段改为指针,缺失时值为 nil
type User struct {
    ID      *int64  `json:"id,omitempty"`
    Name    *string `json:"name,omitempty"`
    Email   *string `json:"email,omitempty"`
}

func main() {
    data := []byte(`{"id": 1, "name": "Bob"}`)
    var u User
    json.Unmarshal(data, &u)
    if u.Email == nil {
        println("Email 字段缺失")
    }
}

常见问题

怎么把 JSON 转成 Go struct?

将 JSON 内容粘贴到左侧输入框,工具会在 400ms 内自动转换并在右侧显示生成的 Go struct。也可以拖拽上传 .json/.txt 文件,或点击「示例」加载内置数据。转换完成后可一键复制或下载 model.go 文件。

生成的 Go 代码包含 json 标签吗?

包含。工具基于 quicktype-core 生成 Go 代码,默认会为每个 struct 字段附带 `json:"原始字段名"` 标签,方便直接用 encoding/json 的 Unmarshal/Marshal 进行序列化与反序列化。

JSON 数组会转成 Go 切片吗?

会。JSON 数组会根据元素类型生成对应的切片类型,例如 `["a","b"]` 生成 `[]string`,`[1,2,3]` 生成 `[]int64`,`[{...},{...}]` 生成 `[]UserItem` 等自定义类型。

嵌套对象会生成多个 struct 吗?

会。每个嵌套对象都会递归生成独立的 struct 类型,命名采用 PascalCase。例如 `address` 对象会生成 `Address` struct,主 struct 中通过 `Address Address` 字段引用。

null 值会生成什么类型?

JSON 中的 null 值通常会被推断为 `interface{}`,这是安全兜底类型。如果你已知该字段实际类型,可在 JSON 中补充一个示例值后重新生成,再手动调整为具体类型。

可以自定义根 struct 的名称吗?

可以。工具默认使用根类型名(如 User),在设置中修改根类型名后,所有关联的子类型命名会同步更新,下载的文件名也会随之改变。

JSON 格式错误怎么办?

工具会自动检测 JSON 合法性,如果存在尾随逗号、单引号、缺引号等常见错误,会显示「修复 JSON」按钮。点击后工具会尝试自动修复并重新生成 Go struct;无法修复时会给出具体错误位置。

数据会上传到服务器吗?隐私安全吗?

不会。所有 JSON 解析、类型推断和 Go 代码生成都在你的浏览器内通过 Web Worker 完成,输入内容和生成的代码不会上传到任何服务器,也不会被记录到云端。包含 API 密钥、token 或业务数据的敏感 JSON 也可以放心使用。

生成的代码可以直接放到 Go 项目里用吗?

可以。生成的代码是标准 Go struct,带有 json 标签,可直接复制到项目的 types/ 或 models/ 目录下使用。建议根据项目命名规范微调类型名和包名。

这个工具收费吗?需要注册吗?

完全免费,无需注册或登录。打开页面即可使用,没有任何功能限制、水印或强制登录。

支持多大的 JSON 文件?

工具没有严格的文件大小限制,但转换速度和渲染性能取决于浏览器与设备性能。建议处理 1MB 以内的 JSON 以获得最佳体验;超大 JSON 可先通过 JSON 格式化或拆分工具处理。

数字类型会统一生成 float64 吗?

不会。工具会区分整数和浮点数:整数字段生成 int64,浮点数字段生成 float64。如果希望使用 int、uint64 等更具体的类型,可在生成后手动替换。

故障排查

右侧提示「请输入 JSON 数据」

左侧输入框为空或只有空白字符。请粘贴有效 JSON,或点击「示例」加载数据,或拖拽上传 .json/.txt 文件。

提示 JSON 解析失败但找不到错误位置

点击输入框下方的「修复 JSON」按钮,工具会自动尝试修复尾随逗号、单引号、缺引号、JS 风格对象等问题。修复后会高亮显示修改后的结果。

生成的字段名不符合 Go 命名规范

工具会按 JSON key 生成 PascalCase 字段名。如果 key 包含中文或特殊字符,可能会生成转义后的字段名。建议把 JSON key 改为英文小写或 snake_case,生成后再统一调整。

null 字段生成了 interface{},想改成具体类型

由于 null 无法推断具体类型,工具用 interface{} 兜底。你可以在源 JSON 中给该字段一个示例值(如 "" 或 0),重新生成后把类型改成 string/int64 等实际类型。

大 JSON 转换后页面卡顿

浏览器渲染超大 JSON 和大量 struct 会消耗较多内存。建议:① 只保留关键字段的示例 JSON;② 拆分成多个对象分别转换;③ 关闭页面其他占用内存的标签。

数组元素类型推断为 []interface{}

当数组为空 [] 或元素类型不一致时,工具会用 interface{} 兜底。可补充同类型示例元素,或在生成后手动把类型改为 []string、[]int64 等具体切片类型。

术语表

struct
Go 的复合数据类型,用于把多个字段组合成一个类型。本工具生成的 Go 代码主体就是若干 struct 定义。
slice
Go 的动态数组类型,语法为 []T。本工具会把 JSON 数组映射为对应的 slice,例如 []string、[]int64、[]UserItem。
json tag
Go struct 字段后的反引号字符串,如 `json:"user_name"`,用于指定 encoding/json 序列化/反序列化时的字段名。本工具会自动生成该标签。
interface{}
Go 的空接口类型,可以表示任意值。本工具在遇到 JSON null 或类型无法确定时,会用 interface{} 作为安全兜底。
PascalCase
每个单词首字母大写的命名风格,如 UserName、AddressCity。Go 要求可导出字段必须以大写字母开头,因此本工具会自动把 JSON 字段名转为 PascalCase。
encoding/json
Go 标准库中的 JSON 编解码包。本工具生成的 struct 配合 json 标签后,可直接用 json.Unmarshal 和 json.Marshal 处理。
unmarshal
把 JSON 字节流解析为 Go 值的过程。生成 struct 后,最常见的用法就是调用 json.Unmarshal(data, &user)。
omitempty
Go json tag 的常用选项,如 `json:"name,omitempty"`,表示字段为零值时省略输出。本工具默认不生成 omitempty,可在生成后按需手动添加。

JSON 类型到 Go 类型映射速查表

本工具根据 JSON 值的类型自动推断对应的 Go 类型,常见映射关系如下:

JSON 值示例生成 Go 类型说明
"hello"string字符串直接映射
true / falsebool布尔值
42int64无小数点的数字
3.14float64含小数点的数字
nullinterface{}无法推断具体类型时的安全兜底
["a","b"][]string字符串数组
[1,2,3][]int64整数数组
[{...},{...}][]UserItem对象数组,元素类型递归生成
{"id":1}User对象生成独立 struct

常见 Go 数字类型选择建议

工具默认使用 int64 和 float64,实际项目中可按需求调整:

场景推荐类型原因
普通整数 ID、计数int64与工具默认一致,兼容大多数 JSON 数字
数据库自增主键已知为正uint64避免负数,语义更清晰
32 位系统或明确小范围整数int32减少内存占用
价格、经纬度、科学计算float64与工具默认一致,标准浮点精度
精确货币计算decimal.Decimal / intfloat64 有精度风险,建议使用 shopspring/decimal 或以分为单位的 int

Privacy & Security

本 JSON 转 Go 工具的所有处理完全在你的浏览器本地完成:JSON 解析、类型推断、Go 代码生成全部通过 Web Worker 在客户端执行,输入的 JSON 内容、上传的文件以及生成的 Go 代码都不会上传到任何服务器,也不会被记录、缓存或存储到云端。关闭或刷新页面后,所有输入和输出内容自动从内存清除,仅 localStorage 会保留你最近输入的历史记录(可随时清空)。适合处理含 API 密钥、token、敏感业务数据的 JSON。