我想基于其最大/最小(数字)或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}},可以在数组中定义不同的类型,但我们如何根据最小/最大值进行验证?
答案 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中出现问题,我会优先考虑它。