100 % local: tus datos nunca salen de tu navegador

JSON a JSON Schema — un contrato para tu CI

Convierte una muestra JSON en un JSON Schema 2020-12. Las claves requeridas y additionalProperties son interruptores: el contrato dice lo que quieres.

Instantáneo Privado Cero cookies
Indentación

Entrada JSON

Salida JSON Schema

Qué hace esta herramienta

Una muestra JSON pasa a ser un JSON Schema en draft 2020-12.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "name": { "type": "string" },
    "address": {
      "type": "object",
      "properties": { "city": { "type": "string" } },
      "required": ["city"]
    }
  },
  "required": ["id", "name", "address"]
}

Los objetos anidados se escriben en su sitio. Sin sección $defs y sin $ref: para una muestra, un esquema en línea es el que se lee de arriba abajo.

Dos ajustes, porque ambas respuestas se defienden

  • Claves requeridas. Activo por defecto: cada clave de la muestra queda listada. Inactivo: ningún array required, y un documento al que le falte una clave valida igualmente.
  • additionalProperties. Permisivo por defecto: una clave de más pasa. En estricto se añade "additionalProperties": false a cada objeto y una clave inesperada es un error.

Ninguna de las dos decisiones se lee en una muestra. Son afirmaciones sobre tu API: te tocan a ti, en vez de adivinarse aquí.

integer y number vienen del literal

3 da integer; 3.0 y 1e3 dan number. JSON tiene un solo tipo numérico: cómo se escribió un número es el único rastro de lo que lo produjo. Un esquema que llame entero a 10.0 rechaza 10.5, con toda probabilidad el registro siguiente: es exactamente lo que esta herramienta hacía hasta que el defecto se encontró y corrigió al escribir estas páginas.

Lo que la muestra no describe

  • "n": null da {"type": "null"}, un esquema que no acepta nada más. Si el campo es una cadena anulable, el retoque es {"type": ["string", "null"]}.
  • Un array vacío da {"type": "array"} sin items: no se afirma nada de elementos que nunca se vieron.
  • Un array heterogéneo da anyOf, listando exactamente las formas presentes.
  • Ni format, ni minLength, ni pattern. Un correo, un UUID y una frase son todos "type": "string" aquí. Añadir "format": "email" sería adivinar un significado, no leer una estructura, y es lo primero que conviene añadir a mano cuando conoces el campo.

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é está todo en `required`?
Porque todas las claves estaban en la muestra, y es la única afirmación que el documento sostiene. También es un ajuste: desactívalo y no se emite ningún array `required`. Dejarlo activo da un esquema que falla ruidosamente ante una clave ausente, que suele ser el mejor punto de partida.
¿Por qué no hay sección `$defs`?
Porque el esquema va en línea: los objetos anidados se escriben donde aparecen, aunque la misma forma salga dos veces. Se lee mejor para una muestra y valida igual. Si estás factorizando un esquema grande, mover los subesquemas repetidos a `$defs` con `$ref` es un retoque que vale la pena.
¿Qué decide entre `integer` y `number`?
El literal. `3` da `integer`, `3.0` y `1e3` dan `number`, porque JSON tiene un solo tipo numérico y la forma escrita es el único testimonio del original. Un esquema que llamara entero a `10.0` rechazaría `10.5` —el registro siguiente—, que es lo que esta herramienta hacía hasta que se corrigió.

Convertidores relacionados