如何在架构中使用嵌套的JSON

时间:2019-05-27 05:14:47

标签: joi

尝试如下设置嵌套模式。如果要在存在aa.a时存在bb.c,我希望能够拒绝该架构。

我尝试过不如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一起出现,它不应通过,否则会失败。

是因为这两个东西可能嵌套在其他对象中吗?

我们不能指定像这样的深层链接吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

您可以使用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 ,并且该架构将无法通过验证。使用这种模式,您的示例将按预期失败。