2011-11-20 17 views
5

No soy experto en json. Mientras definía el formato de los resultados de mi API RESTful (es decir, JSON), sentí que sería más fácil documentarlo como mi propio JSON schema. Mientras escribía uno tuve algunas preguntas:Algunas preguntas relacionadas con el esquema personalizado de json

  1. En mi resultado JSON, ¿cómo especifico el URI para el esquema que confirma? --edit-- ¿está usando el atributo $schema?
  2. ¿Existen convenciones/directrices para el control de versiones de esquema JSON? ¿Hay algunos atributos que debo/puedo definir dentro de mi esquema como atributos? Veo JSON schema itself no tiene una versión definida, excepto en su URI especificado como valor de la clave $schema.
  3. ¿Puedo desglosar mi único esquema BIG JSON en varios más pequeños e incluir uno en otro? Al igual que #include en C++, consulte los esquemas múltiples en el JSON que envié al usuario como resultado.
  4. ¿Puedo definir un valor personalizado para la clave "tipo"? P.ej. Me gustaría volver a utilizar la definición de "fecha" de esta manera:

[ignorar esta línea, es para obtener el formato de trabajo para el siguiente JSON ..]

{ 
    "date":{ 
     "type":"object", 
     "properties":{ 
      "month":{ 
       "type":"integer", 
       "minimum":1, 
       "maximum":12 
      }, 
      "year":{ 
       "type":"integer", 
       "minimum":0 
      } 
     } 
    }, 
    "personInfo":{ 
     "type":"object", 
     "properties":{ 
      "name":{ 
       "type":"string" 
      }, 
      "dateOfBirth":{ 
       "type":"date" 
      } 
     } 
    }, 
    "student":{ 
     "type":"object", 
     "properties":{ 
      "id":{ 
       "type":"personInfo" 
      }, 
      "pass_out_year":{ 
       "type":"date" 
      } 
     } 
    } 
} 

en lugar de proporcionar propiedades de " fecha" en varios lugares como este:

{ 
    "personInfo":{ 
     "type":"object", 
     "properties":{ 
      "name":{ 
       "type":"string" 
      }, 
      "dateOfBirth":{ 
       "type":"object", 
       "properties":{ 
        "month":{ 
         "type":"integer", 
         "minimum":1, 
         "maximum":12 
        }, 
        "year":{ 
         "type":"integer", 
         "minimum":0 
        } 
       } 
      } 
     } 
    }, 
    "student":{ 
     "type":"object", 
     "properties":{ 
      "id":{ 
       "type":"personInfo" 
      }, 
      "pass_out_year":{ 
       "type":"object", 
       "properties":{ 
        "month":{ 
         "type":"integer", 
         "minimum":1, 
         "maximum":12 
        }, 
        "year":{ 
         "type":"integer", 
         "minimum":0 
        } 
       } 
      } 
     } 
    } 
} 

acuerdo con 5.1 tipo in the spec, no es posible, pero parece como un caso de uso tan básico!

Respuesta

4
  1. Como correctamente descubrió, $schema se puede usar para especificar el esquema al que se ajusta.
  2. De hecho, encontré este tema mientras buscaba en Google el control de versiones de esquema JSON, y la idea de usar el URI para el control de versiones suena lógico.
  3. Puede usar $ref para vincular a otro esquema que luego se extrae.
  4. De nuevo, puede usar $ref y JSON Pointer para importar definiciones de otros esquemas.

Siempre puede probar las cosas por validating su esquema para ver si ha cometido algún error.

1

La especificación parece sugerir que podría:

Otros valores de tipo pueden ser utilizados con fines personalizados, ...

A continuación, pasa a discutir lo validadores de la implementación mínima podría hacer.

En mi opinión, lo que quiere hacer parece estar bien. Puede ser útil para la claridad de su esquema mantener la referencia de tipo y la definición de tipo en el mismo archivo.

Creo que su archivo incluye Q debe manejarse fuera de json, p. tener un paso dev que genere el json completo de una secuencia de comandos/plantilla (por ejemplo, erb o algo similar) fusionando sus subarchivos. En mi opinión, su servicio siempre debe brindar el tiempo completo requerido para interactuar completamente con ese servicio. Si esto se vuelve inmanejable desde la perspectiva de los clientes, puede ser una señal para refactorizar e introducir otro servicio.

+0

parece como demasiado trabajo, por lo que no voy a hacerlo. Pero sí, una opción factible, especialmente en el entorno tecnológico actual, estoy seguro de que encontrará herramientas para hacer esto en cualquier idioma/env. Gracias. – Kashyap

+0

En la v4 del esquema JSON esto parece no estar permitido más: http://json-schema.org/latest/json-schema-validation.html#anchor79 – Mitar

2

¿Por qué no utiliza el "format" : "date" según #5.23 in JSON Schema Draft 03?

Además su definición de fecha de nacimiento no contiene la fecha que parece ser un error.

+0

Gracias. La pregunta era más para entender cómo definir estructuras personalizadas en lugar de cómo definir 'fecha', que solo tenía como ejemplo. – Kashyap

+0

@artemoboturov El enlace al # 5.23 es válido para JSON Schema Draft 3, pero en el último "borrador estable" 04 no está presente. [El documento de validación del esquema JSON en la sección 7.3.1] (http://json-schema.org/latest/json-schema-validation.html#anchor108) declara "formato" con el valor "fecha-hora". Desafortunadamente no hay una "fecha". –

3

En el momento de escribir estas líneas, la versión actual de la especificación JSON esquema es proyecto-v4, en el que el formato de date-timestring casos es clearly specified y es muy útil en la práctica.

No hay un formato más simple date definido hasta el momento, pero se puede definir fácilmente la propiedad de su objeto como tipo string y luego aplicar una (dialecto de expresiones regulares ECMA 262) formatpattern validation en la parte superior de la misma.

Por ejemplo:

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "title": "Example Schema" 
    "description": "This schema contains only a birth date property" 
    "type": "object", 
    "required": ["birth_date"], 
    "properties": { 
     "birth_date": { 
      "type": "string", 
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" 
     } 
    } 
} 
+0

Pero, ¿y si tiene una birth_date y death_date y join_date y last_modified_date y etc ... qué, entonces, duplicar el patrón en todas partes? –

Cuestiones relacionadas