我需要在JavaScript中验证复杂的对象。需要更好的JSON模式来验证稀疏矩阵数据对象
对象基于词典:
var dict = {'1':true,'2':true,'3':true};
对象储存对(通常是不完全)的矩阵:
var obj = {'1':{
'1': 'str1',
'2': 'str2',
'3': 'str3',
},'2':{
'1': 'str1',
'2': 'str2',
}
};
我就与AJV验证验证架构。
架构要求:
- 1级对象包含从字典中唯一属性。
- 二级对象仅包含字典中的属性。
- 数据是一个字符串
生成模式:
var dict = {'1':true,'2':true,'3':true};
var subProperties = R.map(function(item){
return {
'type' : 'string',
"minLength": 1,
}
}, dict);
var root = {
"type" : "object",
"additionalProperties" : false
};
root.properties = R.map(function(item){
return {
"type" : "object",
'properties' : subProperties,
"additionalProperties" : false
};
}, dict);
console.log(root)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/4.9.0/ajv.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.22.1/ramda.min.js"></script>
这个模式运作良好,但问题是性能。当字典包含200个元素时,需要10秒来编译该模式(验证速度快,编译速度慢)。而且它会随时间抛出内存异常。是否有可能制定更好的验证模式?
非常有趣。你在'propertyNames'的规范中有参考吗?即使'enum'也是遍布于例子中,但在[specification]中看不到(http://json-schema.org/latest/json-schema-validation.html)。 – Hurelu
第一种方法很好,但我没有看到在浏览器中添加ajv关键字的方式。可能吗? 第二种方式也很好,但实际上字典中包含的人名可以有任何符号。所以使正则表达式是可能的,但不幸的是不只是arr.join('|')。 另外我尝试使用“@ref”语法,但编译时间不会改变。这是否意味着Ajv多次编译相同的@ref子模版? – NtsDK
@Hurelu propertyNames是一个提案(请参阅链接),它可以作为ajv的自定义关键字,enum在spec中 - http://json-schema.org/latest/json-schema-validation.html#rfc。第5.20节 – esp