Как использовать вложенный JSON в схеме

Попытка настроить вложенную схему следующим образом. Я хочу иметь возможность отклонить схему, если присутствует bb.c, когда присутствует aa.a.

Я пробовал без, а также xor

{
  Joi.object().keys({
    aa: Joi.object().keys({
      a: Joi.string(),
      b: Joi.string()
    }).unknown(true).with("a", "b"),
    bb: Joi.object().keys({
      c: Joi.string()
    }).unknown(true)
  }).xor( "aa.a" , ["bb.c"])
}

С приведенным ниже объектом xor завершается с ошибкой ValidationError: «значение» должно содержать хотя бы одно из [aa.a, bb.c], но aa.a существует в предоставленных значениях.

{ 
  "aa": {
       "a": "fg",
       "b": "fg"
 },
  "bb": {
        "c": "l"
   }
}

Если я попытаюсь

.without( "aa.a" , ["bb.c"])

тогда схема проходит, хотя, на мой взгляд, она не должна проходить, так как без нее не должно произойти, когда bb.c присутствует вместе с aa.a

Возможно, это потому, что эти две вещи вложены в другие объекты?

Можем ли мы не указывать такие глубоко связанные вещи?

заранее спасибо


joi
person Mark Lloyd    schedule 27.05.2019    source источник


Ответы (1)


Вы можете использовать Joi.when() и создать схема такая:

Joi.object({
    aa: Joi.object().keys({
        a: Joi.string(),
        b: Joi.string()
    }).unknown(true).with('a', 'b'),
    bb: Joi.object().keys({
        c: Joi.string()
    }).unknown(true)
        .when('aa.a', {
            is: Joi.exist(),
            then: Joi.object({ c: Joi.forbidden() })    
        })
});

По сути, это означает, что если присутствует aa.a, то bb.c не допускается, и схема не пройдет проверку. С этой схемой ваш пример потерпит неудачу, как вы ожидаете.

person soltex    schedule 27.05.2019