본문으로 건너뛰기
AZ Tools

JSON to Protobuf 스키마 변환기 (proto3)

JSON 객체를 타입 지정 필드와 중첩 메시지를 갖춘 proto3 .proto 스키마로 브라우저에서 변환합니다.

Protobuf 스키마

사용법

  1. 입력 상자에 JSON을 붙여넣거나 입력합니다.
  2. 선택적으로 루트 메시지 이름을 변경합니다(기본값 Message).
  3. 출력 상자에서 생성된 .proto 스키마를 복사합니다.

자세한 설명

펼치기

JSON 객체를 붙여넣으면 proto3 스키마를 얻습니다. 중첩 객체마다 메시지가 하나씩 생기고, 필드 이름은 protobuf 스타일이 기대하는 스네이크 케이스로 바뀌며, 원래 키가 그대로 되돌아오지 않는 자리에는 json_name 옵션이 붙습니다. 숫자는 int64나 double로, 배열은 repeated 필드로 매핑되고, null은 proto에 타입 없는 null이 없으므로 google.protobuf.Value로 처리됩니다. 내보내기 전에 생각해 봐야 할 부분은 필드 번호인데, 여기서는 순서대로 배정됩니다. 전송 시 필드는 이름이 아니라 번호로 식별되므로, 나중에 이름을 바꾸는 것은 공짜지만 번호를 바꾸면 예전 클라이언트가 조용히 전부 깨집니다. 또 1번부터 15번까지는 1바이트로 인코딩되므로 가장 자주 쓰는 필드에 배정할 가치가 있습니다.

자주 묻는 질문

숫자는 어떻게 타입이 지정되나요?

정수는 int64, 소수점이 있는 숫자는 double이 됩니다. 다른 너비가 필요하면 int32, uint32, float 등으로 변경하세요.

null, 빈 배열, 중첩 배열은 어떻게 되나요?

이들은 google.protobuf.Value로 매핑되며(import "google/protobuf/struct.proto"가 추가됨), proto3에는 기본 null이 없고 repeated repeated 필드를 허용하지 않기 때문입니다.

일부 필드에 json_name 옵션이 있는 이유는 무엇인가요?

proto 필드 이름은 lower_snake_case입니다. 표준 camelCase JSON 매핑이 원래 키를 재현하지 못할 경우 [json_name = "..."] 옵션이 추가되어 JSON이 올바르게 왕복됩니다.

제 JSON이 어딘가로 전송되나요?

아니요. 변환은 전적으로 브라우저에서 이루어지며 아무것도 업로드되지 않습니다.

왕복 변환 후에 정수가 왜 문자열로 돌아오나요?

스키마의 버그가 아니라 proto3의 JSON 매핑 규칙입니다. int64, uint64, sint64, fixed64는 JSON 문자열로 직렬화되는데, 64비트 정수가 자바스크립트 number에서 살아남지 못하기 때문입니다. 온전히 표현되는 마지막 값이 2^53입니다. 그래서 int64 필드에서 만들어진 {"id": 5}는 {"id": "5"}로 돌아옵니다. 소비하는 쪽이 따옴표를 감당하지 못하고 값의 범위가 실제로 충분하다면, 필드를 JSON 숫자로 남는 int32나 uint32로 바꾸세요.

필드 번호가 임의로 보이는데 중요한가요?

와이어 포맷이 실제로 실어 나르는 유일한 부분이 필드 번호입니다. 이름은 오로지 소스 코드를 위해 존재합니다. 그래서 필드 이름을 바꾸는 것은 비용이 없고, 번호를 바꾸는 것은 이미 인코딩된 모든 메시지를 망가뜨립니다. 여기서 두 가지가 따라옵니다. 필드를 지운 뒤 그 번호를 재사용하지 마세요. 대신 reserved로 표시해야 하며, 그러지 않으면 옛 메시지가 새 필드로 디코딩됩니다. 그리고 1~15번은 태그를 1바이트에 담지만 16~2047번은 2바이트가 필요하므로, 메시지가 크고 반복된다면 가장 자주 나오는 필드를 낮은 번호에 두세요. 19000~19999는 프로토버프 자체가 예약해 두었습니다.

관련 도구