2012-05-30 14 views
22

Mi cadena JSON sería tener el formato:Cómo escribir un esquema JSON para una matriz de objetos?

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":4} 
     } 
    ] 
} 

La matriz contiene muchos dataa y b y c. Y no hay otros tipos de objetos.

Si count==0, data debe ser una matriz vacía [].

Estoy usando https://github.com/hoxworth/json-schema para validar tales objetos JSON en Ruby.

require 'rubygems' 
require 'json-schema' 

p JSON::Validator.fully_validate('schema.json',"test.json") 

El schema.json es:

{ 
    "type":"object", 
    "$schema": "http://json-schema.org/draft-03/schema", 
    "required":true, 
    "properties":{ 
    "count": { "type":"number", "id": "count", "required":true }, 
    "data": { "type":"array", "id": "data", "required":true, 
     "items":[ 
      { "type":"object", "required":false, "properties":{ "a": { "type":"object", "id": "a", "required":true, "properties":{ "ax": { "type":"number", "id": "ax", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "b": { "type":"object", "id": "b", "required":true, "properties":{ "bx": { "type":"number", "id": "bx", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "c": { "type":"object", "id": "c", "required":true, "properties":{ "cx": { "type":"number", "id": "cx", "required":true } } } } } 
     ] 
    } 
    } 
} 

Pero esto para test.json pasará la validación, mientras que supongo que debe fallar:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":2} 
     }, 
     { 
      "c": {"z":"aa"} 
     } 
    ] 
} 

Y esto como test.json fallará, mientras que supongo debe pasar:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     } 
    ] 
} 

Parece que el esquema incorrecto valida que la matriz data contenga a,b,c una vez.

¿Cuál es el esquema correcto?

+0

@Phrogz He actualizado la cuestión. Puedes ver el ejemplo. –

Respuesta

30

Del JSON schema spec, sección 5.5. artículos:

Cuando este valor de atributo es una matriz de los esquemas y la instancia
valor es una matriz, cada posición en la matriz de instancia debe ajustarse
al esquema en la posición correspondiente para esta matriz. Este
llamado tupla de mecanografía.

La definición de su esquema requiere que los primeros tres elementos de la matriz sean exactamente esos elementos 'a', 'b' y 'c'. Si items se deja vacío, se permite cualquier elemento de matriz. De forma similar, si additionalItems se deja vacío, se permite cualquier elemento de matriz adicional.

para conseguir lo que quiere, es necesario especificar "additionalItems": false y para el items, creo que el siguiente (algo más corta de sus definiciones) debería funcionar:

"items": { 
    "type": [ 
    {"type":"object", "properties": {"a": {"type": "object", "properties": {"ax": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"b": {"type": "object", "properties": {"bx": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"c": {"type": "object", "properties": {"cx": { "type":"number"}}}}} 
    ] 
} 
+1

esto funciona para mí, gracias –

+1

¿Es esta la forma correcta de usar "tipo" aquí? ¿No sería el valor de "artículos" la matriz en su lugar? –

+0

@Confusion, lo siento por abrir esto de nuevo, pero la solución propuesta no funciona; entonces, por ejemplo, si tuviera más de 3 de los objetos propuestos en la matriz 'data', entonces la validación del esquema falla ... ¿Alguna idea de cómo resolver esto? – jtimz

Cuestiones relacionadas