100 % local: tus datos nunca salen de tu navegador

JSON a Protobuf — un .proto que protoc compila

Convierte una muestra JSON en mensajes proto3. Los nombres se reparan para protobuf y json_name guarda la clave original: los dos lados siguen de acuerdo.

Instantáneo Privado Cero cookies

Entrada JSON

Salida Protobuf

Qué hace esta herramienta

Una muestra JSON pasa a ser mensajes proto3, uno 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;
}

Los números de campo empiezan en 1 en cada mensaje, en el orden en que aparecieron las claves. Son ellos los que protobuf pone en el cable: los nombres son para las personas, los números son el contrato.

La clave original se conserva

Un nombre de campo de protobuf se escribe por convención [a-z_][a-z0-9_]* y no admite guion. content-type pasa por tanto a content_type, y aquí está lo que muerde: el mapeo JSON de proto3 deriva la clave JSON del nombre de campo, en lowerCamelCase. content_type se convierte en contentType, que no es la clave de tus datos.

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

json_name fija la clave original, y el mensaje vuelve a leer el documento del que salió. La opción se emite solo si la reparación cambió algo: una clave ya en snake_case no la necesita, porque un analizador proto3 acepta también el nombre de campo tal cual.

Era un defecto real: el .proto generado dejaba en silencio de casar con su propia entrada. Encontrado al escribir esta página y corregido.

Los enteros de 64 bits viajan como cadenas

Los enteros pasan a int64. En el mapeo JSON de proto3, int64 se codifica como cadena:

{ "id": "12345678901" }

Es la especificación, no una elección de aquí: los números JSON no llevan 64 bits sin riesgo y el mapeo los esquiva. Significa que una vuelta por protobuf cambia el tipo que ve tu consumidor. Si el campo es un contador pequeño, pasar a int32 es un retoque justificado.

Lo que proto3 no sabe decir, lo dice con Value

  • null y los valores desconocidos pasan a google.protobuf.Value, y se añade import "google/protobuf/struct.proto", solo si algo lo necesita.
  • Un array anidado pasa a google.protobuf.ListValue: proto3 prohíbe repeated repeated, así que un array de arrays no tiene forma directa.
  • Un array heterogéneo pasa a repeated google.protobuf.Value, salvo si mezcla enteros y flotantes: entonces repeated double cubre ambos.

La presencia no es lo que parece

En proto3, un campo escalar sin la palabra optional no tiene presencia: tras decodificar, un campo ausente y un campo a 0, "" o false son indistinguibles. Nada en una muestra JSON dice qué claves son realmente opcionales, así que aquí nada se marca optional. Donde la diferencia importe —una nota anulable, una bandera sin fijar—, añadir la palabra es el retoque a hacer.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿Por qué algunos campos llevan `[json_name = "…"]`?
Porque su nombre tuvo que cambiar. Un nombre de campo de protobuf no admite guion: `content-type` pasa a `content_type`, y el mapeo JSON de proto3 busca entonces `contentType`, no la clave que tú tienes. `json_name` fija la original. Sin ella el mensaje deja de leer el JSON del que salió; era un defecto real, corregido.
¿Por qué mis enteros de 64 bits salen como cadenas en el JSON?
Es el mapeo JSON de proto3, no esta herramienta: `int64`, `uint64` y `fixed64` se codifican como cadenas, porque los números JSON no llevan 64 bits sin riesgo. Tu `{"id": 12345678901}` pasa a `{"id": "12345678901"}` tras una vuelta por protobuf. Conviene saberlo antes de que un cliente al otro lado se atragante.
¿Puedo cambiar los números de campo?
Puedes, pero renumerar un mensaje existente rompe la compatibilidad con los datos ya codificados: por el cable viaja el número, no el nombre. Los de aquí empiezan en 1 en cada mensaje, lo que conviene a una definición nueva. Para un mensaje ya en producción, conserva los números existentes y da a los campos nuevos números libres.

Convertidores relacionados