2014-07-15 8 views
16

Biorąc pod uwagę następujący schemat JSON jest to możliwe, aby wskazać, że „nazwa” nieruchomość powinna być unikalna (czyli nie powinno być dwa elementy o tym samym „Nazwa” w „elementów” tablicy.Jak (jeśli to możliwe) zdefiniować w schemacie JSON jedna z właściwości elementów tablicy będzie unikatowa?

{ 
    "root":{ 
     "type":"object", 
     "properties": { 
      "elements": { 
       "type":"array", 
       "minItems": 1, 
       "items":{ 
        "type":"object", 
        "properties":{ 
         "name": { 
          "type":"string", 
          "title":"Element Name", 
          "minLength":3, 
         }, 
         "url": { 
          "type":"string", 
          "title":"Some URL" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

I próbował użyć słowa kluczowego uniqueItems, ale wygląda na to, że został zaprojektowany dla prostych list wartości:

+0

Zgaduję, że to było przez określenie '' uniqueIt ems ": true". Nigdy nie używał go przed http://json-schema.org/example1.html EDYCJA: definicja ietf: http://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3. 4 – luchosrock

+0

Problem to 5.3.4.2. Warunki pomyślnego sprawdzenia poprawności mówią: "instancja sprawdza poprawność, jeśli wszystkie jej elementy są unikatowe.". Ale jak zdefiniować, czy elementy są unikatowe, czy nie? – begie

Odpowiedz

17

Nie, nie jest to możliwe.Z dokumentacji, json-schema: ... format oparty na JSON do definiowania struktury JSON Dane:

Jest dość ograniczony do sprawdzania wartości danych, ponieważ nie jest to celem normy. Wiele osób pytało o to wcześniej, ponieważ powszechne jest żądanie typu "unikalnego identyfikatora". Niestety dla tych, którzy jej potrzebują, json-schema tego nie zapewnia.

Jeśli chcesz zapewnić wyjątkowość, jedyną opcją jest posiadanie "nazwy" jako kluczy właściwości zamiast wartości właściwości.

+2

Dzięki. Rzeczywiście nie jest to możliwe przy obecnym standardzie JSON Schema. Trwa dyskusja, czy ta funkcja zostanie uwzględniona w jednej z przyszłych wersji standardu: https://groups.google.com/forum/?hl=en#!topic/json-schema/CYd8xk1Czyg – begie

+0

Wygląda na to, że jest to możliwe teraz, odnosząc się do dokumentów: https://spacetelescope.github.io/understanding-json-schema/reference/array.html#uniqueness – dude

+0

@dude, to nadal nie jest możliwe. Pytanie dotyczyło egzekwowania wyjątkowości wartości nieruchomości. Unikalność połączonych tablic była dostępna we wcześniejszych wersjach standardu. – jruizaranguren

4

Jeśli refactoring strukturę danych jest opcją, następujące podejście może być pomocne:

  • Wymień tablicę przez mapę. Można to łatwo osiągnąć za pomocą obiektu o numerze patternProperties. Wzór jest wyrażeniem regularnym. Każdy obiekt, który pasuje do wzorca, zostanie zweryfikowany względem schematu właściwości-wzorca. Wzorzec pasujący do dowolnego ciągu znaków = = 3 znaki wygląda następująco: "....*", ale wydaje się, że końcowa ".*" jest zawsze domniemana, więc "..." działa również.
  • Dodawanie dodatkowych właściwości: fałsz jest dodatkowym krokiem do egzekwowania ograniczenia (minLength:3).
  • Aby wymusić co najmniej jeden element na mapie (w swojej macierzy używano minItems:1), należy zastąpić minItems przez minProperties.

... Powstały na poniższym schemacie:

"root": { 
    "type": "object", 
    "properties": { 
    "elements": { 
     "type": "object", 
     "patternProperties": { 
     "...": { 
      "type": "object", 
      "properties": { 
      "url": { 
       "type": "string" 
      } 
      } 
     } 
     }, 
     "additionalProperties": false, 
     "minProperties": 1 
    } 
    } 
} 

Jeśli dokument jak poniższy (fragment) zostało dopasowane starego schematu,

"elements": [ 
    { 
    "name": "abc", 
    "url": "http://myurl1" 
    }, 
    { 
    "name": "def", 
    "url": "http://myurl2" 
    }, 
    { 
    "name": "ghij", 
    "url": "http://myurlx" 
    } 
] 

... jak dokument to (fragment) będzie pasować do nowego schematu:

"elements": { 
    "abc": { 
    "url": "http://myurl1" 
    }, 
    "def": { 
    "url": "http://myurl2" 
    }, 
    "ghij": { 
    "url": "http://myurlx" 
    } 
} 
+0

Ale to nie sprawdza, czy element wewnątrz obiektu jest naprawdę unikalny. – dude

+0

Niestety, specyfikacja JSON zaleca, ale nie wymusza jednoznaczności na kluczach (https://tools.ietf.org/html/rfc7159#section-4). Mimo to niektóre parsery wymuszają wyjątkowość. – yaccob

Powiązane problemy