2

我想根据其最大/最小(数字)或最大长度/最小长度(字符串)来验证模式。我有一个 json 表单:

[
  {
    "key":"foo",  
    "title":"Test",
    "type":"string" 
  }
]

和一个 json 模式:

    {
 "type": "object",
  "properties": {
    "foo": {
        "type": ["number","string"],
        "maxLength":2,
        "minLength":0,
        "minimum":3,
        "maximum":10
    }
  }
}

和一个json模型:

{
  "foo": "bar"
}

为什么此示例不适用于验证?我拥有的模型未验证为假。根据this document,可以在数组中定义不同的类型,但是我们如何根据最小值/最大值进行验证?

4

3 回答 3

2

您的架构是正确的。您使用的验证器无法正常工作。这是替代使用的anyOf替代方法。

{
    "type": "object",
    "properties": {
        "foo": {
            "anyOf": [
                { "$ref": "#/definitions/boundedNumber" }
                { "$ref": "#/definitions/boundedString" }
            ]
        }
    },
    "definitions": {
        "boundedString": {
            "type": "string",
            "maxLength": 2,
            "minLength": 0
        },
        "boundedNumber": {
            "type": "number",
            "minimum": 3,
            "maximum": 10
        }
    }
}

虽然它有点长,但有些人会争辩说,由于类型特定关键字的分离,这实际上更容易阅读/维护。

于 2016-01-27T19:49:18.497 回答
1

您的架构正在验证 JSON 对象 ( "type":"object")。此外,如果他们有一个带有 key 的属性"foo",它的值必须是 3 到 10 之间的数字,或者是最大长度为 2 的字符串。

根据您的架构的有效对象:

{"foo":6}
{"foo":"as"}

无效对象:

{"foo":60}
{"foo":"asereje"}

如果要验证数组,则必须将父对象定义为数组并使用items标记指定数组项的架构,例如:

{
    "type" : "array",
    "items" : {
        "type" : "object",
        "properties" : {
            "foo" : {
                "type" : ["number", "string"],
                "maxLength" : 2,
                "minLength" : 0,
                "minimum" : 3,
                "maximum" : 10
            }
        }
    }
}

上面的模式将验证以下 JSON 数组:

[{
        "foo" : 6
    }, {
        "foo" : "as"
    }
]
于 2016-01-27T12:20:01.847 回答
0

约翰问题是类型"type" : ["number", "string"]

Angular Schema Form 正在从组合的 JSON Schema 和 UI Schema (form) 生成字段,当定义字段类型时,它知道要验证的类型,当有多种类型时,它不知道要基于规范的哪一部分表单字段反对,因此它回退到文本框,并且不单独为字符串添加适当的验证要求。

为了达到您想要的结果,您需要告诉它您希望使用哪种字段类型。在 0.8.x 版本中有一个错误,如果它无法确定数据模式中的类型,它不会根据 UI 模式中设置的类型进行验证,我相信这在最新的开发分支中已修复。如果不是,如果 Git 中出现问题,我会优先处理它。

于 2017-07-21T01:51:01.623 回答