JSON模式,用于验证patternProperties是否与其中一个值匹配

时间:2017-12-30 01:00:42

标签: json jsonschema json-schema-validator

鉴于此架构:

{
  "type": "object",
  "patternProperties": {
    "^(.*)$": {
      "type": "object",
      "patternProperties": {
        "^.*$": {
          "oneOf": [
            {
              "type": "string",
              "enum": ["Token1", "Token2", "Token3"]
            }
          ]
        }
      }
    }
  }
}

我能够验证这类数据:

{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "Token1",
    "otherprop2": "Token3"
  }
}

即。顶级对象下的每个属性值都应该在["Token1", "Token2", "Token3"]枚举中。如果我将Token4设置为值,则无法按预期验证。

是否可以匹配捕获组^(.*)$模式的值,并在oneOf下添加另一条规则,暗示:或者该值是(顶级)对象名称的集合?要成功验证这样的事情:

{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "myobject",    <- note this
    "otherprop2": "Token3"
  }
}

失败
{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "non-existing-object",    <- note this
    "otherprop2": "Token3"
  }
}

并且最好/可选地检查基本递归以使该输入失败:

{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "anotherobject",    <- note this
    "otherprop2": "Token3"
  }
}

1 个答案:

答案 0 :(得分:0)

不使用JSON架构。其领域是结构验证;您描述的规则可以在代码中实现。有些验证器允许使用自定义关键字。

顺便说一下,您可以使用additionalProperties关键字将架构应用于所有属性。