100 % local — seus dados nunca saem do seu navegador

JSON para Protobuf — um .proto que o protoc compila

Transforme uma amostra JSON em mensagens proto3. Os nomes são reparados para o protobuf e o json_name guarda a chave original: os dois lados se entendem.

Instantâneo Privado Zero cookies

Entrada JSON

Saída Protobuf

O que esta ferramenta faz

Uma amostra JSON vira mensagens proto3, uma por objeto.

{ "id": 1, "name": "Ada", "tags": ["admin"], "address": { "city": "Paris" } }
syntax = "proto3";

message Root {
  int64 id = 1;
  string name = 2;
  repeated string tags = 3;
  Address address = 4;
}

message Address {
  string city = 1;
}

Os números de campo começam em 1 em cada mensagem, na ordem em que as chaves apareceram. São eles que o protobuf põe no fio: nomes são para pessoas, números são o contrato.

A chave original é preservada

Um nome de campo do protobuf se escreve por convenção [a-z_][a-z0-9_]* e não aceita hífen. content-type vira portanto content_type — e aqui está o que morde: o mapeamento JSON do proto3 deriva a chave JSON do nome do campo, em lowerCamelCase. content_type vira contentType, que não é a chave dos seus dados.

string content_type = 1 [json_name = "content-type"];

json_name fixa a chave original, e a mensagem volta a ler o documento de onde saiu. A opção só é emitida se o conserto mudou algo: uma chave já em snake_case não precisa dela, porque um analisador proto3 também aceita o nome do campo como está.

Era um defeito real: o .proto gerado deixava, em silêncio, de casar com a própria entrada. Encontrado ao escrever esta página e corrigido.

Inteiros de 64 bits viajam como strings

Os inteiros viram int64. No mapeamento JSON do proto3, int64 é codificado como string:

{ "id": "12345678901" }

É a especificação, não uma escolha daqui — números JSON não carregam 64 bits sem risco, e o mapeamento os contorna. Isso significa que uma volta pelo protobuf muda o tipo que o seu consumidor vê. Se o campo for um contador pequeno, passar para int32 é um retoque justificado.

O que o proto3 não sabe dizer, ele diz com Value

  • null e os valores desconhecidos viram google.protobuf.Value, e import "google/protobuf/struct.proto" é acrescentado — só quando algo precisa.
  • Um array aninhado vira google.protobuf.ListValue: o proto3 proíbe repeated repeated, então um array de arrays não tem forma direta.
  • Um array heterogêneo vira repeated google.protobuf.Value, salvo quando mistura inteiros e flutuantes: aí repeated double cobre os dois.

A presença não é o que se imagina

No proto3, um campo escalar sem a palavra optional não tem presença: depois de decodificar, um campo ausente e um campo em 0, "" ou false são indistinguíveis. Nada numa amostra JSON diz quais chaves são realmente opcionais, então aqui nada é marcado optional. Onde a diferença importa — uma nota anulável, uma flag não definida — acrescentar a palavra é o retoque a fazer.

Privado por padrão

Tudo é executado localmente no seu navegador com JavaScript. Os seus dados nunca são enviados para um servidor, o que torna a ferramenta segura para conteúdo sensível e funciona offline.

Perguntas frequentes

Por que alguns campos levam `[json_name = "…"]`?
Porque o nome deles teve de mudar. Um nome de campo do protobuf não aceita hífen: `content-type` vira `content_type` — e o mapeamento JSON do proto3 passa então a procurar `contentType`, não a chave que você tem. `json_name` fixa a original. Sem ela a mensagem deixa de ler o JSON de onde saiu; era um defeito real, corrigido.
Por que meus inteiros de 64 bits viram strings no JSON?
É o mapeamento JSON do proto3, não esta ferramenta: `int64`, `uint64` e `fixed64` são codificados como strings, porque números JSON não carregam 64 bits sem risco. Seu `{"id": 12345678901}` vira `{"id": "12345678901"}` depois de uma volta pelo protobuf. Bom saber antes que um cliente do outro lado engasgue.
Posso mudar os números de campo?
Pode, mas renumerar uma mensagem existente quebra a compatibilidade com dados já codificados: quem viaja no fio é o número, não o nome. Os daqui começam em 1 em cada mensagem, o que serve a uma definição nova. Para uma mensagem já em produção, mantenha os números existentes e dê números livres aos campos novos.

Conversores relacionados