2011-11-18 10 views
32

commonjs-utilsのnode.js + json-schema.jsを使用してJSON APIを検証しようとしています。単一の検証は簡単でしたが、複数のスキーマファイルを管理して互いを参照できるようにする方法を見つけることができませんでした。複数のJSONスキーマファイルを管理するにはどうすればよいですか?

2つのモデル& 2つのAPIがあるとします。

// book 
{ 
    "type": "object", 
    "properties": { 
     "title": { "type": "string" }, 
     "author": { "type": "string" } 
    } 
} 
// author 
{ 
    "type": "object", 
    "properties": { 
     "first_name": { "type": "string" }, 
     "last_name": { "type": "string" } 
    } 
} 
// authors API 
{ 
    "type": "array", 
    "items": { "$ref": "author" } 
} 
// books API: list of books written by same author 
{ 
    "type": "object", 
    "properties": { 
    "author": { "$ref": "author" } 
    "books": { "type": "array", "items": { "$ref": "book" } } 
    } 
} 

各スキーマを別々のファイルに分割してオンラインにする必要がありますか?または、以下のような単一のスキーマファイルに結合できますか?可能であれば、どうすればローカルスキーマを参照できますか?

JSONスキーマで
// single schema file { 
    "book": { ... }, 
    "author": { ... }, 
    "authors": { ... }, 
    "books": { ... } } 

答えて

46

、あなたはファイルごとにスキーマを配置し、その(あなたがそれらを保存)URL、またはidタグで大きなスキーマを使用してそれらにアクセスすることができます。ここで

は一つの大きなファイルのためです:

{ 
    "id": "#root", 
    "properties": { 
     "author": { 
      "id": "#author", 
      "properties": { 
       "first_name": { 
        "type": "string" 
       }, 
       "last_name": { 
        "type": "string" 
       } 
      }, 
      "type": "object" 
     }, 
     // author 
     "author_api": { 
      "id": "#author_api", 
      "items": { 
       "$ref": "author" 
      }, 
      "type": "array" 
     }, 
     // authors API 
     "book": { 
      "id": "#book", 
      "properties": { 
       "author": { 
        "type": "string" 
       }, 
       "title": { 
        "type": "string" 
       } 
      }, 
      "type": "object" 
     }, 
     // books API: list of books written by same author 
     "books_api": { 
      "id": "#books_api", 
      "properties": { 
       "author": { 
        "$ref": "author" 
       }, 
       "books": { 
        "items": { 
         "$ref": "book" 
        }, 
        "type": "array" 
       } 
      }, 
      "type": "object" 
     } 
    } 
} 

あなたはその後、(idで定義されている)、これらのサブスキーマのいずれかにあなたのバリデータを参照することができます。あなたのスキーマの外から

、この:

{ "$ref": "url://to/your/schema#root/properties/book" } 

がこれに相当します

{ "$ref": "url://to/your/schema#book" } 

…内側から、これまで、同等である:

{ "$ref": "#root/properties/book" } 

またはこれを(まだ内部から):

{ "$ref": "#book" } 

は、より多くの情報のための私のanswer hereを参照してください。

+0

node.jsに分離されたスキーマファイルでオブジェクトを作成する方法はありますか? – uzay95

+1

@ uzay95スキーマはクラスではありません。スキーマはオブジェクトの構造を定義し、検証するために使用され、クラスは初期化後のオブジェクトの構造を定義します。 jsでクラスが必要な場合は、Typescript、AtScript、またはES6を調べてみてください。あるいは、node.jsにインクルードする外部ファイル内にモジュールまたはコンストラクタファクトリメソッドを置くだけです。 –

関連する問題