JavaScriptで複雑なオブジェクトを検証する必要があります。私はAJVバリデータと検証スキーマを作るスパース行列データオブジェクトを検証するためにJSONスキーマが必要です
var obj = {'1':{
'1': 'str1',
'2': 'str2',
'3': 'str3',
},'2':{
'1': 'str1',
'2': 'str2',
}
};
:ペアの
var dict = {'1':true,'2':true,'3':true};
オブジェクトストアマトリックス(通常は完全ではない):
オブジェクトが辞書に基づいています。
スキーマの要件:
- は1レベルのオブジェクトは、ディクショナリからプロパティのみが含まれています。
- 第2レベルのオブジェクトには、辞書のプロパティのみが含まれます。
- データは、文字列
生成スキーマれる:
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-keywordsを追加する方法はありません。出来ますか? 2番目の方法も良いですが、実際に辞書にはシンボルを持つことができる人の名前が含まれています。だから、正規表現を作ることは可能ですが、不幸にもarr.join( '|')だけではありません。 また、 "@ref"構文を使用しようとしましたが、コンパイル時間は変わりません。それはAjvが同じ@refサブスキーマを何度もコンパイルすることを意味しますか? – NtsDK
@Hurelu propertyNamesはプロポーザルです(リンクを参照)。これはajvのカスタムキーワードとして使用できます。enumは仕様です - http://json-schema.org/latest/json-schema-validation.html#rfc。 section.5.20 – esp