高效通信:JSON Schema To Protobuf定义 — Numio
将 object 类型的 JSON Schema 转换为 proto2 message 定义。字段按属性顺序编号;必需属性变为 "required",其余变为 "optional",数组变为 "repeated",嵌套对象变为嵌套 message,并生成一个使用它的字段。
你有一个事件的 JSON Schema,想得到一份 .proto message 初稿,再针对 gRPC 或 Kafka 管道进行修改。
适用场景
- 你有一个事件的 JSON Schema,想得到一份 .proto message 初稿,再针对 gRPC 或 Kafka 管道进行修改。
- 在自己编写 message 之前,想确认现有 schema 的标量字段会映射为哪些 protobuf 类型。
使用方法
- 粘贴根节点为 "type": "object" 的 JSON Schema。message 名称取自转换为 PascalCase 的 "title"(或 "name" 键);两者都没有时为 Root。
- 转换在浏览器中进行,没有任何设置。
- 从 Protobuf 面板复制 proto2 文本,在用于 .proto 文件前检查类型。
JSON Schema
{
"title": "Order",
"type": "object",
"properties": {
"id": { "type": "string" },
"quantity": { "type": "integer" },
"price": { "type": "number" },
"paid": { "type": "boolean" },
"tags": { "type": "array", "items": { "type": "string" } },
"shipping": { "type": "object", "properties": { "city": { "type": "string" } } }
},
"required": ["id", "quantity"]
}Protocol Buffers (proto2)
syntax = "proto2";
message Order {
message Shipping {
optional string city = 1;
}
required string id = 1;
required int32 quantity = 2;
optional double price = 3;
optional bool paid = 4;
repeated string tags = 5;
optional Shipping shipping = 6;
}功能与限制
转换使用本站自己的转换器在浏览器中运行,schema 不会发送到服务器。
integer 映射为 int32(format 为 int64 或取值范围超出 32 位时为 int64),number 映射为 double(format 为 float 时为 float),boolean 映射为 bool。数组元素类型按同样方式映射。
字符串 enum 变为嵌套 enum,值为带前缀的 UPPER_SNAKE;additionalProperties schema 变为 map<string, T>;指向 definitions 或 $defs 的本地 $ref 指向顶层 message。
数组的数组、包含多个非 null 分支的 oneOf/anyOf 以及无类型属性会回退为 string。指向其他文件的 $ref 会报错。
FAQ
能生成 proto3 吗?
不能。输出始终以 syntax = "proto2" 开头,并使用 required/optional 标签。
message 名称如何确定?
取根节点的 "title" 并转换为 PascalCase,例如 "Example Schema" 变为 ExampleSchema;也可取自 "name" 键。两者都没有时 message 名为 Root。嵌套 message 和 enum 以对应属性命名。
["string", "null"] 这类可为空的字段如何处理?
null 部分会被丢弃,字段使用剩余的类型,例如 ["number", "null"] 变为 optional double height。proto2 的 optional 字段本身就可以缺省。
我的 schema 会被上传吗?
不会。本页面在浏览器中转换 schema,不调用服务器 API。