2015-06-19 2 views
5

Для следующей строки JSON:В чем разница между свойствами и patternProperties в json-схеме?

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

Следующая схема считает действительным:

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

Однако, изменение в patternProperties к свойствам еще считает действительными. В чем же разница между этими двумя тегами?

ответ

0

Свойства (пары ключ-значение) объекта определяются с помощью ключевого слова properties. Значение свойств - это объект, где каждый ключ является именем свойства, а каждое значение - это схема JSON, используемая для проверки этого свойства.

Дополнительные свойства могут ограничивать объект, чтобы он не имел дополнительных свойств, которые явно не указаны, или может указывать схему для любых дополнительных свойств объекта. Иногда этого недостаточно, и вы можете ограничить имена дополнительных свойств или можете сказать, что, учитывая определенный вид имени, значение должно соответствовать конкретной схеме. Вот в чем заключается patternProperties: это новое ключевое слово, которое отображает из регулярных выражений в схемы. Если дополнительное свойство соответствует заданному регулярному выражению, оно также должно быть проверено против соответствующей схемы.

Примечание: при определении регулярных выражений важно отметить, что выражение может совпадать в любом месте имени свойства. Например, регулярное выражение «p» будет соответствовать любому имени свойства с p в нем, например, «apple», а не только к свойству, имя которого просто «p». Поэтому, как правило, менее сложно смешивать регулярное выражение в^... $, например, «^ p $».

для дальнейшего использования - http://spacetelescope.github.io/understanding-json-schema/reference/object.html

+0

Первый пункт прямо противоречит примеру я дает: Когда я изменить ключевое слово patternProperties к свойствам без изменения остальной части схемы, он по-прежнему работает, то есть ключевое слово properties также обрабатывает регулярное выражение. –

+0

может быть связано с тем, что ключевое слово property обработало ваше регулярное выражение как свойство, имеющее тип значения только как число, и вы предоставляете число, из-за чего оно приняло ваше значение. Я не уверен. – Kandy

0

Семантические свойств:

  • Если вы объявляете свойство с ключом, включенным в свойствах, она должна удовлетворять схемы, объявленные в свойствах.

Семантика patternProperties:

  • Если вы объявляете свойство и ключ удовлетворяет регулярное выражение, определенное в patternProperties, она должна удовлетворять схему, объявленную в patternProperties.

Согласно the docs, свойства приоритет выше, чем patternProperties, а это означает, что схема сверяются patternProperties только если не было совпадения свойств первой.

5

Для схемы выше всех свойств должно быть число. Эти данные недействительны:

{ a: 'a' } 

Если заменить patternProperties со свойствами только имущество, должно быть число «+».. Все остальные свойства могут быть любыми.Это будет некорректно:

{ '.+': 'a' } 

Это было бы справедливо:

{ a: 'a' } 
+0

Что вы имеете в виду, когда говорите, что все остальные свойства могут быть чем угодно? Означает ли это, что ни одно из других свойств не будет проверено? как я могу это ограничить? –

+0

В случае «patternProperties» все свойства, соответствующие шаблонам в ключах, будут проверены. Если вы используете «свойства», будут проверены только свойства, равные ключам. Поэтому, если вы хотите проверить шаблон соответствия свойств, вы должны использовать 'patternProperties'. Если вы хотите проверить все свойства в отношении одной и той же схемы, лучше использовать «дополнительные свойства». Ваша схема может быть '' '{" type ":" object "," AdditionalProperties ": {" type ":" number "}}' '' - для этого потребуются все свойства - числа. Использование patternProperties для этого случая неэффективно. – esp

+0

в порядке, поэтому свойства будут только проверять поля, если у них одинаковый соответствующий ключ. patternProperties будет соответствовать всем ключам, которые подпадают под этот шаблон. ДополнительноProperties проверяет все остальные свойства в файле, еще не сгенерированном свойствами или patternProperties. Правильно ли я понимаю? 2 вопроса здесь 1. Почему patternProperties неэффективен для этого случая? 2. Не существует способа указать, что мой файл будет содержать это свойство? Как и в случае сбоя, если файл содержит любое другое свойство, не упомянутое здесь? –

Смежные вопросы