проверка схемы json с ключевым словом oneOf

У меня есть следующая схема json для моего веб-приложения.

{  
  "type":"object",
    "properties": {
     "person_identifier":{
        "type":"object",
        "oneOf":[
               {"$ref":"#/person_identifier/rememberme_id"},
               {"$ref":"#/person_identifier/email"},
               {"$ref":"#/person_identifier/account_number"}
        ],
        "email":{
            "type":"string"
        },
        "rememberme_id":{
            "type":"string"
        },
        "account_number":{
            "type":"string"
        }    
       }
    }
}

Моя цель - принять только один из трех "person_identifier" - email, Rememberme_id или account_number в запросе API к моему приложению. Я не могу подтвердить, что приведенная выше схема будет обеспечивать соблюдение требуемых ограничений. Я пробовал выполнить проверку на jsfiddle.com, но он показывает, что моя схема неправильно проверяет ввод. Вот мой код для проверки на jsfiddle.com:

var data, schema;

schema = {  
     person_identifier:{
           type:'object',
           'oneOf':[
               {$ref:'#/person_identifier/rememberme_id'},
               {$ref:'#/person_identifier/email'},
               {$ref:'#/person_identifier/buyer_account_number'}
           ],
        'email':{
            type:'string'
        },
        'rememberme_id':{
            type:'string'
        },
        'account_number':{
            type:'string'
        }    
       }
};

data = {
  person_identifier: {
    email: '[email protected]',
    rememberme_id: '1345'
  }
};

alert('Validation: ' + tv4.validate(data, schema, true));

Например, jsfiddle проверяет данные как правильно соответствующие схеме, хотя этого не должно. Должен быть разрешен только один входной идентификатор. Я сослался почти на все доступные вопросы и документацию по использованию oneOf. Любые указатели на то, что я делаю неправильно? Спасибо.


person user_19    schedule 30.05.2014    source источник


Ответы (1)


Схема в моем вопросе была неправильной. Схема означала соответствие oneOf (все три ссылки), email, Rememberme_id, Buy_account_number. Данные (электронная почта и Rememberme_id) совпадают с подресурсами электронной почты и Rememberme_id (индивидуально) для person_identifier. Они присутствовали отдельно вместе с ключевым словом oneOf, поэтому oneOf никогда не работал.

Используя простое объяснение из http://www.asbjornenge.com/wwc/json_schema.html Я понял свою ошибку. Для сложных примеров oneOf, в отличие от упомянутого в предыдущей ссылке, мы можем использовать общее «свойство» во всех подсхемах, предназначенное для ограничения ключевым словом oneOf («identifierType» в ссылках для ответов, которые я опубликовал выше). Крайне важно иметь этот общий, но дифференцирующий фактор, который заставляет oneOf работать. Кроме того, подсхемы в oneOf, на которые мы ссылаемся, должны полностью присутствовать внутри массива oneOf (Answer2) или передаваться в качестве ссылки (Answer1). Их нельзя разделить запятыми вместе с oneOf, поскольку это противоречит цели (ошибка, которую я делал). Я сослался на ответ @cloudfeet на this вопрос.

Надеюсь это поможет.

Используя http://geraintluff.github.io/tv4/try/, я смог сформулирую два ответа на мой вопрос. Вот ссылки: Ответ1 и < a href = "http://geraintluff.github.io/tv4/try/#?data=%7B%0A%20%20%20%20%22potential_payer_info%22:%20%7B%0A%20%20% 20% 20% 20% 20% 20% 20% 22identifierType% 22:% 20% 22email% 22,% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 22value% 22:% 22abc @ abc .com% 22% 0A% 20% 20% 20% 20% 7D% 0A% 7D & schema =% 7B% 0A% 20% 20% 20% 22type% 22:% 22object% 22,% 0A% 20% 20% 20% 22properties% 22:% 7B% 0A% 20% 20% 20% 20% 20% 20% 22potential_payer_info% 22:% 7B% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 22oneOf% 22:% 5B% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 7B% 0A% 20% 20% 20% 20% 20% 20% 20% 20 % 20% 20% 20% 20% 20% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 22 собственности % 22:% 7B% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 22identifierTyp e% 22:% 7B% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20 % 20% 20% 20% 22type% 22:% 22string% 22,% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20 % 20% 20% 20% 20% 20% 20% 20% 20% 22enum% 22:% 5B% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 22email% 22% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 5D% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 7D,% 0A% 20% 20% 20% 20% 20% 20% 20% 20 % 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 22 значение% 22:% 7B% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 22type% 22:% 22string% 22% 0A% 20% 20% 20 % 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 7D% 0A% 20% 20% 20% 20% 20 % 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20% 7D% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 20% 20 % 20% 20% 20% 20% 20% 0A% 20% 20%

person user_19    schedule 02.06.2014