обязательное ключевое слово в схеме JSON

Я получил приведенную ниже схему из http://json-schema.org/examples.html, я хотите знать, может ли требуемое ключевое слово находиться только на верхнем уровне. или он также может входить в свойства, если есть свойство типа object. Я не смог найти ничего, связанного с этим, в спецификации http://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.4.3 < / а>.

{
    "title": "Example Schema",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        }
    },
    "required": ["firstName", "lastName"]
}

Итак, приведенный ниже пример является действительной схемой.

{  
   "title":"Example Schema",
   "type":"object",
   "properties":{  
      "firstName":{  
         "type":"string"
      },
      "lastName":{  
         "type":"string"
      },
      "age":{  
         "type":"object",
         "properties":{  
            "minAge":{  
               "type":"number"
            },
            "maxAge":{  
               "type":"number"
            },
            "required":[  
               "minAge",
               "maxAge"
            ]
         }
      }
   },
   "required":[  
      "firstName",
      "lastName"
   ]
}

person user2478236    schedule 01.04.2015    source источник
comment
Ваш вложенный required находится не в том месте. Это должен быть партнер properties, а не ребенок. Вы правильно поняли это на верхнем уровне, так что я уверен, что это была опечатка.   -  person Jason Desrosiers    schedule 07.04.2015


Ответы (3)


4.4 Ключевые слова с возможностью проверки экземпляров контейнера (массивов или объектов) проверяют только сами экземпляры, а не их дочерние элементы (элементы массива или свойства объекта).

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

person M4ks    schedule 01.04.2015
comment
так что мое последнее изменение является действующей схемой, она требует нескольких уровней. - person user2478236; 01.04.2015
comment
Это неверный ответ. Проверка действительно работает рекурсивно. Фактически, проверка схемы JSON была бы бесполезной, если бы эта цитата имела в виду то, что, по вашему мнению, она делает. Предположим, вы проверяете массив, элементы которого должны соответствовать заданной схеме. Если эти элементы не проходят проверку, проверка не завершится ошибкой для ключевого слова items, она не будет выполнена при проверке всего массива. Цитата означает, что ключевое слово отвечает только за определение схемы для проверки. Он не несет ответственности за проверку соответствия схеме. Это происходит на следующем этапе. - person Jason Desrosiers; 07.04.2015
comment
@Jason, не могли бы вы уточнить, я не мог понять проверку элементов массива, если бы вы могли поделиться простой схемой с проверкой массива, это было бы более понятно. - person user2478236; 08.04.2015
comment
@ user2478236, в комментарии сложно уточнить подробности. Я предлагаю вам использовать jsonschemalint, чтобы создать несколько схем и посмотреть, как они проверяются на примере данных. - person Jason Desrosiers; 09.04.2015
comment
@Jason На самом деле проверка схемы JSON была бы бесполезной, если бы эта цитата означала то, что, по вашему мнению, она делает. - похоже, это просто означает, что проверка должна выполняться на том же уровне. Это может привести к выводу, что на каждом уровне должны быть свои собственные обязательные правила, которые отвечают на вопросы и выглядят действительно правильно. - person M4ks; 09.04.2015
comment
@ M4ks, я прочитал ваш ответ, в котором говорится, что валидатор должен проверять только верхний уровень схемы и игнорировать любых дочерних элементов. Вот почему я сказал, что схема JSON не была бы очень полезной, если бы это было правдой. Теперь я понимаю, что вы на самом деле пытались сказать. Извините, я неправильно назвал ваш ответ. Просто нужно было немного доработать. Однако я все же утверждаю, что ваша интерпретация процитированного вами отрывка неверна. Объяснение в моем первом комментарии - это то, что оно должно означать. - person Jason Desrosiers; 10.04.2015

Ключевое слово required может присутствовать в любой схеме. Это верно для всех ключевых слов схемы.

(Это особый случай для мета-ключевого слова $schema, для которого рекомендуется иметь только на верхнем уровне)

person cloudfeet    schedule 01.04.2015

Да, required является допустимым ключевым словом в любой схеме. Для вложенных схем ограничений нет.

Чтобы использовать ваш пример, следующая действительная схема будет проверять, как вы хотите.

{  
    "title": "Example Schema",
    "type": "object",
    "properties": {  
        "firstName": {  
            "type": "string"
        },
        "lastName": {  
            "type": "string"
        },
        "age": {  
            "type": "object",
            "properties": {  
                "minAge": {  
                    "type": "number"
                },
                "maxAge": {  
                    "type": "number"
                }
            },
            "required": [  
                "minAge",
                "maxAge"
            ]
        }
    },
    "required": [  
        "firstName",
        "lastName"
    ]
}
person Jason Desrosiers    schedule 06.04.2015