2015-06-19 29 views
5

Na poniższym json ciąg:Jaka jest różnica między właściwościami a wzorcami w schemacie JSON?

{ 
    "abc" : 123, 
    "def" : 345 
} 

Poniższy schemat uważa za ważne:

{ 
    "$schema": "http://json-schema.org/draft-03/schema#", 
    "title": "My Schema", 
    "description": "Blah", 
    "type": "object", 
    "patternProperties": { 
     ".+": { 
      "type": "number" 
     } 
    } 
} 

Jednakże, zmieniając się patternProperties do właściwości nadal uważa za ważne. Jaka jest więc różnica między tymi 2 znacznikami?

Odpowiedz

0

Właściwości (pary klucz-wartość) obiektu są zdefiniowane za pomocą słowa kluczowego właściwości. Wartością właściwości jest obiekt, w którym każdy klucz jest nazwą właściwości, a każda wartość jest schematem JSON używanym do sprawdzania poprawności tej właściwości.

additionalProperties może ograniczyć obiekt tak, że nie ma żadnych dodatkowych właściwości, które nie zostały jawnie wymienione, lub może określić schemat dla dodatkowych właściwości obiektu. Czasem to nie wystarcza i możesz chcieć ograniczyć nazwy dodatkowych właściwości lub możesz powiedzieć, że biorąc pod uwagę konkretny rodzaj nazwy, wartość powinna pasować do konkretnego schematu. Tutaj pojawia się patternProperties: jest to nowe słowo kluczowe, które odwzorowuje od wyrażeń regularnych do schematów. Jeśli dodatkowa właściwość pasuje do danego wyrażenia regularnego, musi również sprawdzić poprawność względem odpowiedniego schematu.

Uwaga: Podczas definiowania wyrażeń regularnych należy pamiętać, że wyrażenie może pasować do dowolnego miejsca w nazwie właściwości. Na przykład wyrażenie regularne "p" dopasuje dowolną nazwę właściwości z literą p, taką jak "jabłko", a nie tylko właściwością, której nazwa jest po prostu "p". Dlatego zwykle mniej zagmatwane jest otaczanie wyrażenia regularnego w^... $, na przykład "^ p $".

dla dalszego odniesienia - http://spacetelescope.github.io/understanding-json-schema/reference/object.html

+0

akapit pierwszy bezpośrednio zaprzecza przykład dałem: Kiedy zmienić słowo kluczowe patternProperties do właściwości bez zmiany reszty schematu, nadal działa, co oznacza, że ​​słowo kluczowe właściwości przetwarza również wyrażenie regularne. –

+0

może być spowodowane słowem dotyczącym właściwości, które potraktowało twoje wyrażenie regularne jako właściwość mającą typ wartości tylko jako liczbę i podajesz liczbę, dla której zaakceptowała twoją wartość. Nie jestem pewien ... – Kandy

0

semantyczna właściwości:

  • Jeśli zadeklarować obiekt z klucza zawartego w nieruchomości, musi ona spełniać schematu zadeklarowanej właściwości.

semantyczna od patternProperties:

  • Jeśli zadeklarować właściwości i klucz zaspokojenia regex zdefiniowany w patternProperties, musi ona spełniać schematu zadeklarowanej w patternProperties.

Według the docs priorytet nieruchomości jest wyższa niż patternProperties, co oznacza, że ​​schemat jest sprawdzana przed patternProperties tylko wtedy, gdy nie było dopasowanie właściwości pierwszy.

5

Dla schematu powyżej wszystkie właściwości powinny być liczbami. Te dane są nieprawidłowe:

{ a: 'a' } 

Po zamianie właściwości patternProperties na właściwość tylko właściwość ". +" Powinna być liczbą. Wszystkie inne właściwości mogą być dowolne.To byłby nieważny:

{ '.+': 'a' } 

Byłoby to ważne:

{ a: 'a' } 
+0

Co masz na myśli mówiąc, że wszystkie inne własności mogą być cokolwiek? Czy to oznacza, że ​​żadna z innych właściwości nie zostanie zatwierdzona? jak mogę to ograniczyć? –

+0

W przypadku właściwości "patternProperties" wszystkie właściwości pasujące do wzorców w kluczach zostaną zweryfikowane. Jeśli użyjesz "właściwości", sprawdzane będą tylko właściwości równe kluczom. Więc jeśli chcesz sprawdzić poprawność właściwości pasujących do wzorca, powinieneś użyć 'patternProperties'. Jeśli chcesz sprawdzić wszystkie właściwości w odniesieniu do tego samego schematu, lepiej użyć "additionalProperties". Twój schemat może mieć postać '' '{" type ":" object "," additionalProperties ": {" type ":" number "}}' '' - będzie wymagać, aby wszystkie właściwości były liczbami. Użycie właściwości patternProperties w tym przypadku jest nieefektywne. – esp

+0

OK, więc właściwości sprawdzają tylko pola, gdy mają dokładnie ten sam klucz dopasowania. Parametr patternProperties będzie dopasowywał wszystkie klucze, które wchodzą w ten wzorzec. additionalProperties sprawdza wszystkie inne właściwości w pliku, które nie są jeszcze powiązane przez właściwości lub właściwości patternProperties. Czy moje zrozumienie jest poprawne? 2 pytania tutaj 1. Dlaczego właściwości patternProperties są nieskuteczne w tym przypadku? 2. Czy nie można określić, że mój plik będzie zawierał tylko tę właściwość? Jak w przypadku niepowodzenia, jeśli plik zawiera jakąkolwiek inną właściwość nie wymienioną tutaj? –