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
nulle os valores desconhecidos viramgoogle.protobuf.Value, eimport "google/protobuf/struct.proto"é acrescentado — só quando algo precisa.- Um array aninhado vira
google.protobuf.ListValue: o proto3 proíberepeated 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 doublecobre 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.