2013-03-13 12 views
12

Mam nieuporządkowaną tablicę elementów JSON. Zgodnie ze specyfikacją http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.5 poniższy schemat json będzie sprawdzany tylko wtedy, gdy obiekty w tablicy pojawią się w TYM ZAMÓWIENIU. Nie chcę określać kolejności, wystarczy zweryfikować obiekty w tablicy, niezależnie od kolejności lub liczby obiektów. Ze specyfikacji nie mogę zrozumieć, jak to się robi.Poprawny schemat JSON dla tablicy elementów różnych typów

"transactions" : { 
    "type" : "array", 
    "items" : [ 
     { 
      "type" : "object", 
      "properties" : { 
       "type" : { 
        "type" : "string", 
        "enum" : ["BUILD", "REASSIGN"] 
       } 
      } 
     }, 
     { 
      "type" : "object", 
      "properties" : { 
       "type" : { 
        "type" : "string", 
        "enum" : ["BREAK"] 
       } 
      } 
     } 
    ] 
} 
+0

Cóż, ten JSON nie jest nawet ważny od samego początku. –

+0

Czy możesz wskazać mi konkretną nieprawidłową część? Jest to fragment ze znacznie większego pliku schematu JSON, który sam przekazuje json lint w sam raz. Być może jest literówka, której nie widzę? Nie sądzę, żeby to było warte uwagi - możesz po prostu zaproponować edycję. – deepwinter

+0

Znalezione nieprawidłowości - skutki uboczne, kiedy wyciągnąłem JSON z większego pliku. – deepwinter

Odpowiedz

27

Zapytałem to samo pytanie w grupie google JSON schema schematu i szybko udzielono odpowiedzi. FGE użytkownik proszony że mogę napisać swoją odpowiedź tutaj:

Witam,

Obecna specyfikacja jest projekt v4, a nie projekt v3. Więcej konkretnie specyfikacja walidacja jest tutaj:

http://tools.ietf.org/html/draft-fge-json-schema-validation-00

strona Sieć nie jest do tej pory, nie wiem dlaczego ... Ja złożyć ściągania prośbę.

z projektem v4 można użyć to:

{ 
    "type": "array", 
    "items": { 
     "oneOf": [ 
      {"first": [ "schema", "here" ] }, 
      {"other": [ "schema": "here" ] } 
     ] 
    } 
} 

Na przykład, jest to schemat na tablicy, gdzie elementy mogą być albo struny lub liczbami całkowitymi (może to być napisane w sposób bardziej prostym sposobem choć):

{ 
    "type": "array", 
    "items": { 
     "oneOf": [ 
      {"type": "string"}, 
      {"type": "integer"} 
     ] 
    } 
} 

to jest prawidłowa odpowiedź. Moja poprawione schematu obejmuje obecnie:

"transactions" : { 
    "type" : "array", 
    "items" : { 
     "oneOf" : [ 
      { 
       "type" : "object", 
       "properties" : { 
        "type" : { 
         "type" : "string", 
         "enum" : ["BUILD", "REASSIGN"] 
        } 
       } 
      }, 
      { 
       "type" : "object", 
       "properties" : { 
       "type" : { 
        "type" : "string", 
        "enum" : ["BREAK"] 
        } 
       } 
      } 
     ] 
    } 
} 
2

Zajmuję się tym również od dłuższego czasu. Ale nie udało się znaleźć działającego rozwiązania. Działa dobrze, jeśli masz tylko jeden schemat, np.

"transactions" : { 
      "type" : "array", 
      "items" : 
      { 
      "type" : "object", 
      "properties" : { 
       "type" : { 
       "type" : "string", 
       "enum" : ["BREAK"] 
       }, 
      } 
} 

Następnie wystarczy pominąć nawiasy szykowe i użyć obiektu. Jednak jeśli chcesz robić to, co robisz, wydaje się, że nie ma solidnej odpowiedzi. Jest to jedyna rzecz, którą do tej pory znalazłem: http://the-long-dark-tech-time.blogspot.se/2012/12/using-json-schema-with-array-of-mixed.html

2

Dla każdego skazani schematu projekt 3. Istnieje „Type” słowo kluczowe, które jest równoznaczne z „anyOf” w projekcie 4:

Więc można użyć

{ 
    "fooBar" : { 
     "type" : "array", 
     "items" : { 
      "type" : [{ 
        "type" : "object", 
        "properties" : { 
         "foo" : {       
          "type" : "string" 
         } 
        } 
       }, { 
        "type" : "object", 
        "properties" : { 
         "bar" : { 
          "type" : "string" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 
0

W odpowiedzi na użytkownika Vdex: to nie jest równoznaczne, co write oznacza, że ​​elementy tablicy występują w w tym konkretnym zamówieniu w obrębie tablicy.

Z zastrzeżeniem prawidłowej implementacji, jeśli używasz this schema validator.

Z tego schematu:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "array", 
    "items": [ 
    { 
     "type": "boolean" 
    }, 
    { 
     "type": "number" 
    }, 
    { 
     "type": "string" 
    } 
    ] 
} 

Ten JSON zostanie potwierdzony:

[ 
    true, 
    5, 
    "a", 
    "6", 
    "a", 
    5.2 
] 

ale nie ten:

[ 
    5, 
    true, 
    "a", 
    "6", 
    "a", 
    5.2 
] 

Zatem cel jest zupełnie inny od słów kluczowych, takich jak "jeden z".

Powiązane problemy