如何使用json模式验证字符串和数字

时间:2016-01-27 11:44:56

标签: json validation jsonschema angular-schema-form

我想基于其最大/最小(数字)或maximumLength / minimumLength(字符串)验证模式。 我有一个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 example不能用于验证?我的模型未经验证为false。根据{{​​3}},可以在数组中定义不同的类型,但我们如何根据最小/最大值进行验证?

3 个答案:

答案 0 :(得分: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
        }
    }
}

虽然时间相当长,但有些人会认为,由于特定类型关键字的分离,实际上这更容易阅读/维护。

答案 1 :(得分:1)

您的架构正在验证JSON对象("type":"object")。此外,如果它们具有键"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"
    }
]

答案 2 :(得分:0)

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

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

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