どんな “柔軟な” すなわち “拡張性のある” ファイルフォーマットを作っても、遅かれ早かれ開発者のグループがバリデーションに関して文句を言い始める。多くがこのことに対処できるが、それらは以下のように分類できる。
- データが正しくフォーマットされていると仮定する。
- 手動で間違った形式のデータを確認し、修正しようとする。
- 手動で間違った形式のデータを確認し、適切なら拒否する。
- 間違った形式のデータを自動的に確認する。
この記事の目的は、これらのオプションを議論することではなく、自動バリデーションに利用できるツールキットをまとめることである。
JSON スキーマ
JSON スキーマ は、17 の異なるプロジェクトでサポートされている、提案された標準だ。JavaScript、Java、Python、Ruby、Perl、PHP、.NET、ActionScript、C、Haskell、および Erlang で利用できる。その形式は、実際のデータにほとんど似ていないスキーマを持つ VeriJSON よりも複雑だ。それはまた、数の範囲チェック、リストの制限、リストに重複したエントリを防ぐ事が出来る機能を持ち、もっと包括的である。また、他のスキーマへの参照をサポートし、大規模なスキーマを小さなコンポーネントに分解することができる。
Atdgen
Atdgen は、OCamlで JSON のシリアル化および逆シリアル化をサポートしている。JSON のスキーマは、atd ファイルとして知られているものを使用して作成される。これらのファイルは、OCaml クラスファイルを生成するコードジェネレーターとオブジェクト/JSON コンバーターをマッチさせることで走る。Atdgen では、バリデーションは、逆シリアル化プロセス中に発生します。
atdファイル中のバリデーションルールは、オープンエンドで、開発者は、どんなOCamlコードでもatdファイルに直接注入できる。セカンダリースキーマファイルへの参照がサポートされている。
Atdgen は、オープンソースライセンスのもとで入手できる。
DataContractJsonSerializer
WCFの DataContractSerializerに基づいたDataContractJsonSerializerは、クラス定義とデータコントラクト属性を使って、どのようにJSONファイルをバリデートし、最終的に逆シリアライズするかを決める。これは基本的タスクに適しているが、パフォーマンス問題が発生する傾向にあり、辞書の作成が困難である。バリデーションは、基本的な構造にかなり制限されている。
Json.NET
James Newton-King氏が作ったJson.NETは、今日入手できる中で最も包括的なJSON シリアライザ/逆シリアライザである。 DataContractJsonSerializerのようにJson.NETは、クラスを使ってスキーマを定義できる。標準のWCFデータコントラクト属性、あるいはJSON.NETのシリアライズ属性を使うことができる。DataTable と nHibernate のエンティティを含む様々なタイプをサポートしている。今月にJSON.NET 5.0は、無制限サイズの整数(BigIntegerを介して)とIEnumerable コンストラクタを公開するリードオンリーのコレクションをサポートする。
JSON.NETはまた、JSON スキーマを介して、バリデーションをサポートする。
VeriJSON
VeriJSONは、パターンベースのマッチングを使用したObjective-C ライブラリである。パターン自身がJSONで書かれており、サポートされている型は “number”, “string”, “bool”, “url”である。文字列は、正規表現を使って制限できる。urlは、スキーマ(例えば、http, ftp)によって制限できる。配列やオブジェクトは、構造的に表せ、オプションのプロパティがサポートされている。
VeriJSON は、オープンソースライセンスの下で入手できる。