JSON 转 Protobuf, 粘 JSON 出 proto3 的 message 定义, 自动推断标量类型, 字段递增编号, 字段名 snake_case, 数组用 repeated, 嵌套对象生成命名 message。
- 本地处理
- 分类 开发运维
- 适合 格式化、校验、压缩或检查和代码相关的文本。
类型、字段编号和 repeated 是怎么推断的
每个 JSON 对象生成一个命名 message, 字段用 snake_case(protobuf 风格指南要求), 按 key 顺序分配递增的字段编号(1, 2, 3...)—— 决定线上身份的是编号而不是字段名。整数推断成 int64(JS 的 number 会溢出 int32, 所以 int64 是安全默认); 带小数的推断成 double; 一个数字有时是整数有时带小数, 字段会放宽到 double。对象数组会折叠成一个 message, 字段变成 repeated; 标量数组变成 repeated <标量>。只出现过 null 的值, 或真正混合的数组, 会退化成 google.protobuf.Any(并自动补上对应的 import)。切到 proto2 会输出显式的 optional 标签, 还能设置 package, 或在 proto3 下开启 optional 表示显式字段存在性。
这个工具能做什么
把任意 JSON (REST API 响应、Kafka 事件、配置文件、内部记录) 粘进来, 拿到一份 Protocol Buffers schema, 可以直接存成 `.proto` 喂给 `protoc`。每个 JSON 对象生成一个命名 `message`, 字段用 snake_case (protobuf 风格指南要求), 并按 key 顺序分配递增的字段编号 (`1`、`2`、`3`...)。因为 protobuf 在线上是用编号而不是字段名来标识 字段的, 所以把 `userId` 改成 `user_id` 是无损的。数字不会被一锅端: 整数样本推断成 `int64` (JS 的 number 会溢出 `int32`, 所以 `int64` 是 安全默认), 带小数的推断成 `double`, 一个字段有时是整数有时带小数时 放宽到 `double`。对象数组会折叠成一个 message, 字段变成 `repeated`, 所以 `[{"a":1},{"a":1,"b":2}]` 出来是一个同时带两个字段的 message, 而不是两个几乎重复的类型。标量数组变成 `repeated <标量>`, 嵌套对象 会抽成自己的命名 message (`User.address` → `UserAddress`)。只出现过 `null` 的值, 或真正混合类型的数组, 会退化成 `google.protobuf.Any`, 并自动补上对应的 `import`。可以在 proto3 和 proto2 之间切换, 设置 `package`, 在 proto3 下开启 `optional` 标签表示显式字段存在性, 改根 message 名, 然后一键复制或下载 `.proto`。全部在浏览器里跑。JSON 不碰服务器。
工具细节
- 输入
- 文本 + 数值 + 结构化内容
- 页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
- 输出
- 即时结果 + 复制 + 下载
- 结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
- 隐私
- 浏览器本地处理
- 主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
- 保存 / 分享
- 可分享链接状态
- 关键设置会进入 URL,复制链接后别人能复现同一组参数。
- 性能预算
- 首屏 JS ≤ 25 KB
- 没有声明 WASM 依赖,适合快速打开和移动端使用。
- 适用场景
- 开发运维 · 程序员
- 分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。
怎么用
-
1. 输入
把内容粘贴或拖入工具面板。
-
2. 处理
点击按钮,在浏览器内本地处理,文件不上传。
-
3. 复制 / 下载
一键复制结果或下载到本地。
JSON 转 Protobuf 适合怎么用
适合穿插在写代码、查问题、做 Review、上线前的小任务里。
适合开发场景
- 格式化、校验、压缩或检查和代码相关的文本。
- 把片段整理好再放进文档、工单、提交或交接材料。
- 不切换工具,快速检查一个小 payload。
开发检查项
- 压缩、混淆这类不可逆处理,先对副本操作。
- 除非确认工具本地处理,不要粘贴密钥和敏感片段。
- 转换后的代码上线前,仍要跑自己的测试或 lint。
下一步可以接着做
这些入口会把当前任务接到更完整的工具链里。
- 1 JSON 转 Go 结构体 JSON 转 Go struct, 粘 JSON 出带 json tag 的结构体, 字段自动导出, 嵌套对象生成子 struct, 可空字段用指针, 支持 int64 与 omitempty。 打开
- 2 JSON 转 Rust 结构体 JSON 转 Rust struct, 粘 JSON 出带 serde derive 的结构体, 字段 snake_case, 自动 serde rename, 可空用 Option, 数组用 Vec, 嵌套对象生成子 struct。 打开
- 3 JSON 转 TypeScript Interface JSON 转 TypeScript interface, 粘 JSON 出干净 interface, 数组元素合并为 union, 可选字段自动识别, 根类型名可命名。 打开
真实使用场景
从现有 JSON API 起一份 gRPC 服务契约
你要把一个 REST 接口迁到 gRPC, 需要 `.proto` 跟 JSON 现在返回的 形状对上。curl 一次拿到响应, 粘进来, 根名设为 `GetUserResponse`, 复制输出到 `user.proto`。嵌套的 `address` 对象抽成 `GetUserResponseAddress`, `roles` 数组变成 `repeated string`, 字段编号都预先分配好了, 你可以立刻跑 `protoc`, 并在上线前调整编号。
把第三方 webhook 反推成有类型的 message
某第三方发来的 webhook 是没有 schema 的 JSON。记下几次 payload, 挑一个有代表性的粘进来, 你就得到一个能反序列化进去的 `message`, 而不是去戳 `map[string]interface{}`。某次 payload 有、另一次没有 的字段, 并集会被一个折叠后的 message 捕获, 所以一份 `.proto` 就覆盖了你实际观察到的各种变体。
生成 Kafka / 事件总线的 message 定义
你们团队事件总线统一用 protobuf, 但生产者在原型阶段还在发 JSON。 粘一个样本事件, 把 `package` 设成 `events.v1`, 拿到一个干净的 message, 时间戳是 `int64`, item 列表是 `repeated`。放进 schema registry, Go、Java、Rust 的消费者都能从同一份 `.proto` 生成对得 上的类型。
在定下语法版本前对比 proto3 和 proto2 的输出
你接手了一个 proto2 的代码库, 想看看一个新 payload 在两种语法下 长什么样。粘进 JSON, 切一下语法开关, proto2 会加上显式的 `optional` 标签, proto3 则保持简洁。判断哪个适配你的工具链, 然后 只在真正需要区分"未设置"和"零值"的字段上开启 proto3 的 `optional`。
把没有文档的内部 payload 写成 schema
一个老服务到处传一个臃肿的 JSON 大块, 没有任何契约。粘一个真实 例子, 用 message 名命名根, 生成的 `.proto` 就成了活文档: 每个 字段有类型, 每个嵌套对象有名字, 每个数组都标了 `repeated`。把它 提交进仓库, 下一个工程师读的是 schema, 而不是对着 `json.loads` 猜。
常见踩坑
把生成的字段编号当成最终结果。编号是按 JSON key 顺序分配的, 但线上是用编号作为契约的。一旦上线, 字段名可以随意改, 但编号绝不能复用或重排。生产前先审一遍编号, 给打算新增的字段加 `reserved` 区间。
期待小整数或无符号 ID 用 int32 / uint32。JSON 不给宽度也不给符号, 所以所有整数都推断成 `int64`, 也就是能装下毫秒时间戳和雪花 ID 的安全超集。只在你知道真实取值域时手动收窄成 `int32` / `uint32` / `uint64`; 一个 JSON `-1` 会让无符号类型崩。
以为单个对象能体现可选字段。proto3 在线上没有 required/optional 之分, 而单个对象也没有"key 缺失"信号, 所以所有字段都是普通单值。想看可选/并集字段怎么折叠, 粘一个对象数组 (`[{...},{...}]`), 让有的元素带某个 key、有的不带。
粘 JSON5 / 带注释的 JSON / 末尾逗号。我们用严格的 `JSON.parse`, 注释、不带引号的 key、末尾逗号都会报错。先剥掉, 或者先过一道 JSON 格式化工具。
隐私说明
你粘进来的 JSON 不会离开这个浏览器标签页。解析和类型推断走浏览器 内建的 `JSON.parse`, 没有任何网络请求, 也不对文本框内容做 analytics。 分享链接会把你的输入和选项编码进 URL 以便复现结果, 也就是说由你 决定何时分享。如果 payload 敏感 (内部 ID、客户数据、生产响应), 直接复制生成的 `.proto`, 不要分享链接。只有你的 syntax 和 optional 标签偏好会存进 localStorage, 让你的风格在多次访问之间保留。
常见问题
类似工具组合
做你这行的人, 还会一起用这些。