【问题标题】:How to use nested JSON in schema如何在模式中使用嵌套 JSON
【发布时间】:2019-05-29 04:29:43
【问题描述】:

尝试如下设置嵌套模式。如果存在 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


    【解决方案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 并且架构将无法通过验证。使用此架构,您的示例将按预期失败。

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 2020-01-30
      • 2022-01-17
      • 2019-07-27
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多