如何在架构中使用嵌套 JSON

How to use nested JSON in schema

正在尝试按如下方式设置嵌套架构。如果存在 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:"value" 必须至少包含 [aa.a、bb.c] 之一,但 aa.a 存在于提供的值中

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

如果我尝试

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

然后架构通过,尽管在我看来它不应该通过,因为当 bb.c 与 aa.a

一起出现时应该会失败

难道是因为这两个东西嵌套在其他对象中?

我们能不能像这样指定深度链接的东西?

提前致谢

您可以使用 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 是不允许的,并且该模式将无法通过验证。使用此架构,您的示例将如您所料失败。