Herramienta para generar esquema JSON a partir de datos JSON [cerrado]

178

Tenemos este borrador de esquema json . Me gustaría obtener una muestra de mis datos JSON y generar un esqueleto para el esquema JSON, que pueda volver a trabajar manualmente, agregando cosas como descripción, requerido, etc., que no pueden deducirse de los ejemplos específicos.

Por ejemplo, desde mi entrada example.json:

{
    "foo": "lorem", 
    "bar": "ipsum"
}

Ejecutaría mi herramienta json_schema_generator y obtendría:

{ "foo": {
    "type" : "string",
    "required" : true,
    "description" : "unknown"
  },
  "bar": {
    "type" : "string",
    "required" : true,
    "description" : "unknown"
  }
}

Este ejemplo se ha codificado manualmente, por lo que puede tener errores. ¿Existe alguna herramienta que pueda ayudarme con la conversión JSON -> esquema JSON?

blueFast
fuente
Pero, ¿cómo podría saber la herramienta que no es un mapa genérico de cadenas a cadenas?
hmakholm dejó a Mónica el
1
En el ejemplo proporcionado, diría que está claro que tenemos un diccionario (terminología de python), con pares clave-valor, donde los valores son cadenas. No conozco ningún otro esquema JSON que describa los mismos datos. Y este es solo un ejemplo fácil: podría ser mucho más complicado, por supuesto, como se especifica en el borrador del esquema JSON.
blueFast
3
¿Entonces está afirmando que "la asignación de cadenas arbitrarias a otras cadenas arbitrarias" (como una asignación de nombres de archivos a descripciones del contenido) no puede expresarse como un esquema JSON? Por lo que sé, eso puede ser cierto, pero haría que ese tipo de esquemas sea bastante inútil en mi opinión.
hmakholm dejó a Mónica el
1
Mmmm, no estoy seguro de que estemos discutiendo algo relevante a la pregunta, pero de todos modos. Usemos un mejor ejemplo: tener claves fijas en los datos JSON es definitivamente útil si esos datos JSON describen, por ejemplo, las propiedades de una persona. En lugar de "foo" y "bar", piense en "nombre" y "apellido". "nombre" y "apellido" son propiedades claramente fijas de los datos JSON de la persona, por lo que no son cadenas arbitrarias: son parte del esquema de la persona. Los valores son, por supuesto, arbitrarios, por lo que no forman parte del esquema.
blueFast
3
Tener llaves fijas es a veces lo que quieres, y a veces no. De hecho, ese es el punto: no hay forma de que una herramienta automatizada pueda detectar en una sola muestra cuáles de las opciones desea.
hmakholm dejó a Mónica el

Respuestas:

92

Quizás estés buscando esto:

http://www.jsonschema.net

Es una herramienta en línea que puede generar automáticamente un esquema JSON a partir de una cadena JSON. Y puede editar el esquema fácilmente.

Su verde
fuente
3
Un lugar fácil y práctico para comenzar. Pero tenga en cuenta los problemas informados con jsonschema.net identificados en otra parte de esta página, y las razones discutidas para querer incluir una herramienta fuera de línea, o al menos accesible para API, en los flujos de trabajo de desarrollo, permitir la actualización de esquemas con ejemplos posteriores, etc. lista de opciones de Steve Bennett.
nealmcb
Tenga en cuenta que este sitio arrojará errores inesperados al editar el esquema después de la importación inicial.
Coreus
1
Se bloquea por algo parecido {"hello": "world","num": 42}pero parece prometedor-
DBX12
3
Los sitios antiguos definitivamente no eran lo suficientemente buenos. JSONSchema.Net ahora ha sido reescrito. Es mucho más robusto. Si tiene algún problema, infórmelo
Jack
jsonschema2pojo.org es lo que he estado usando durante años
Someone Somewhere
83

Resumiendo las otras respuestas, aquí están los generadores de esquemas JSON propuestos hasta ahora:

En línea:

Pitón:

NodoJS:

Rubí:

Steve Bennett
fuente
jskemetor - nosetup.py
Att Righ
¿Alguna posibilidad de saber si alguno de estos admite entradas YAML? Podríamos convertir, pero solo un paso extra.
DylanYoung
28

GenSON ( PyPI | Github ) es un generador de esquemas JSON que puede generar un solo esquema a partir de múltiples objetos. También puede fusionar esquemas con él. Está escrito en Python y viene con una herramienta CLI.

(Divulgación completa: soy el autor).

Wolverdude
fuente
1
Buen trabajo, hombre! Lamento no haber encontrado esto antes de comenzar a trabajar en skinfer: github.com/scrapinghub/skinfer
Elias Dorneles
1
No es una pitón, pero aquí hay otra github.com/snowplow/schema-guru
chuwy
1
¡Excelente! Me ha decepcionado el generador de esquemas en línea jsonschema.net (no puede crear propiedades "requeridas" para la mayoría de los objetos, no tiene opciones para producir propiedades compactas (una línea) u omitir ID, y lo más importante, genera un esquema que no puede validar los datos utilizados para crearlos para matrices de esquema único). Estoy ansioso por probar tu herramienta.
Dave
@Dave: también estoy enfrentando problemas similares con json schema.net, ¿me ayudó esta herramienta de Python?
Cshah
1
@Cshah: Estoy extremadamente impresionado con GenSON y contribuí con un parche. Necesitaba generar esquemas más restrictivos de lo que el autor se sentía cómodo, así que bifurqué una versión con opciones para generar propiedades de patrones y propiedades adicionales / Artículos adicionales para que los datos JSON no reconocidos se marquen como si necesitaran atención.
Dave
6

Después de varios meses, la mejor respuesta que tengo es mi herramienta simple. Es crudo pero funcional.

Lo que quiero es algo similar a esto . Los datos JSON pueden proporcionar un esqueleto para el esquema JSON. Todavía no lo he implementado, pero debería ser posible proporcionar un esquema JSON existente como base, para que el esquema JSON existente más los datos JSON puedan generar un esquema JSON actualizado. Si no se proporciona dicho esquema como entrada, se toman valores completamente predeterminados.

Esto sería muy útil en el desarrollo iterativo: la primera vez que se ejecuta la herramienta, el esquema JSON es ficticio, pero se puede refinar automáticamente de acuerdo con la evolución de los datos.

blueFast
fuente
2
Curioso sobre cómo la sugerencia de @Green Su no estuvo a la altura de sus necesidades. Creo que está describiendo una utilidad que proporciona jumpstarter (su término es 'esquelético'), ¿algo así como un generador de código de andamio?
justSteve
13
Básicamente, el problema con esa herramienta es que es una herramienta en línea . Lo necesito para ejecutarlo localmente en mi entorno de desarrollo, a veces automáticamente como parte de otras tareas. Una herramienta de "copiar aquí, pegar allí" no me ayuda. Si tuviera una API REST, sería lo suficientemente bueno.
blueFast
2
@justSteve: la herramienta en línea, además de utilizar un flujo de trabajo de copiar y pegar, sigue apareciendo defectuosa (4 años después de la pregunta original). Tengo objetos json para los cuales la herramienta produce esquemas incorrectos pero aún no los he reducido a casos de prueba mínimos para enviarlos como informes de errores.
Dave
5

Hay una herramienta de Python para generar el esquema JSON para un JSON dado: https://github.com/perenecabuto/json_schema_generator

Vinícius Mendes
fuente
44
Esto no se mantiene desde 2013. No es compatible con Python 3. Además, solo es compatible con un borrador anterior, es decir draft-03.
Acumenus
5

generate-schema( NPM | Github ) toma un objeto JSON que genera esquemas a partir de él, una salida es JSON Schema, está escrito en Node.js y viene con una herramienta REPL y ClI para canalizar archivos.

Divulgación completa: soy el autor :)

Nijikokun
fuente
¿Algún plan para actualizar el módulo al borrador 4+? ¿Agregar min, max attrs, referencias, etc.? Gracias por la herramienta por cierto :) Lo usaré en mi Proyecto
Sr. Alien
5

Hay una herramienta nodejs que admite json schema v4 en https://github.com/krg7880/json-schema-generator

Funciona como una herramienta de línea de comandos o como una biblioteca de nodejs:

var jsonSchemaGenerator = require('json-schema-generator'),
    obj = { some: { object: true } },
    schemaObj;

schemaObj = jsonSchemaGenerator(json);
Johann Philipp Strathausen
fuente
1
¡Viene con una CLI también!
Peter Ilfrich
3

json-schema-generator es un generador de esquemas JSON basado en Ruby. Es compatible con los borradores 3 y 4 del esquema JSON. Se puede ejecutar como un ejecutable independiente o se puede incrustar dentro de un script Ruby.

Entonces puede usar json-schema para validar muestras JSON contra su esquema recién generado si lo desea.

HappyCoder86
fuente
3

Para las herramientas fuera de línea que admiten múltiples entradas, lo mejor que he visto hasta ahora es https://github.com/wolverdude/GenSON/ Me gustaría ver una herramienta que tome nombres de archivos en la entrada estándar porque tengo miles de archivos . Sin embargo, me quedo sin descriptores de archivo abiertos, así que asegúrese de que los archivos estén cerrados . También me gustaría ver los generadores de esquemas JSON que manejan la recursividad. Ahora estoy trabajando en generar clases Java a partir de objetos JSON con la esperanza de ir al esquema JSON desde mis clases Java. Aquí está mi script GenSON si tiene curiosidad o desea identificar errores en él.

#!/bin/sh
ulimit -n 4096
rm x3d*json
cat /dev/null > x3d.json
find ~/Downloads/www.web3d.org/x3d/content/examples -name '*json' -      print| xargs node goodJSON.js | xargs python bin/genson.py -i 2 -s     x3d.json >> x3d.json
split -p '^{' x3d.json x3d.json
python bin/genson.py -i 2 -s x3d.jsonaa -s x3d.jsonab /Users/johncarlson/Downloads/www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter02-GeometryPrimitives/Box.json > x3dmerge.json 
John Carlson
fuente
Primero, ¿puedes dar una respuesta a unix.stackexchange.com/questions/211803/… ?
Dave
2

Se mencionan muchas herramientas, pero una más llamada inferencia de esquema JSON para el registro:

https://github.com/rnd0101/json_schema_inferencer

(no es una biblioteca o un producto, sino un script de Python)

Con la divulgación completa habitual: soy el autor.

Roman Susi
fuente