JSON 스키마에서 Protobuf 정의로 변환 — Numio
object 타입 JSON Schema를 proto2 message 정의로 변환합니다. 필드는 속성 순서대로 번호가 매겨지며, 필수 속성은 "required", 나머지는 "optional", 배열은 "repeated"가 되고 중첩 객체는 중첩 message와 이를 사용하는 필드가 됩니다.
이벤트용 JSON Schema가 있고, gRPC나 Kafka 파이프라인에 맞게 손볼 .proto message 초안이 필요할 때.
이럴 때 사용하세요
- 이벤트용 JSON Schema가 있고, gRPC나 Kafka 파이프라인에 맞게 손볼 .proto message 초안이 필요할 때.
- message를 직접 작성하기 전에 기존 스키마의 스칼라 필드가 어떤 protobuf 타입에 대응하는지 확인하고 싶을 때.
사용 방법
- 루트가 "type": "object"인 JSON Schema를 붙여 넣습니다. message 이름은 "title"을 PascalCase로 바꾼 값(또는 "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;
}세부 정보 및 제한 사항
변환은 사이트 자체 변환기로 브라우저에서 실행되며 스키마는 서버로 전송되지 않습니다.
integer는 int32(format이 int64이거나 경계값이 32비트 범위를 벗어나면 int64), number는 double(format이 float이면 float), boolean은 bool로 매핑됩니다. 배열 항목 타입도 같은 방식으로 매핑됩니다.
문자열 enum은 접두사가 붙은 UPPER_SNAKE 값을 가진 중첩 enum이 되고, additionalProperties 스키마는 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"] 같은 nullable 필드는 어떻게 처리되나요?
null 부분은 버리고 나머지 타입을 사용합니다. 예를 들어 ["number", "null"]은 optional double height가 됩니다. proto2 optional 필드는 원래 생략될 수 있습니다.
스키마가 업로드되나요?
아니요. 이 페이지는 브라우저에서 스키마를 변환하며 서버 API를 호출하지 않습니다.