2013-10-17 7 views
10

たとえば、ファイルシステムのスキーマの場合、ディレクトリにはファイルのリストが含まれます。スキーマは、ファイルの指定、次にサブタイプ「イメージ」、もう1つの「テキスト」から構成されます。JSONスキーマバリデータにプロパティ値からスキーマを選択する方法を教えてください。

下部にメインディレクトリスキーマがあります。ディレクトリには、ファイルのサブタイプでなければならないアイテムの配列であるプロパティコンテンツがあります。

基本的に私が探しているのは、検証されているjsonオブジェクトのプロパティから "$ ref"の値を調べるようにバリデーターに指示する方法です。

例JSON:

{ 
    "name":"A directory", 
    "content":[ 
     { 
      "fileType":"http://x.y.z/fs-schema.json#definitions/image", 
      "name":"an-image.png", 
      "width":1024, 
      "height":800 
     } 
     { 
      "fileType":"http://x.y.z/fs-schema.json#definitions/text", 
      "name":"readme.txt", 
      "lineCount":101 
     } 
     { 
      "fileType":"http://x.y.z/extended-fs-schema-video.json", 
      "name":"demo.mp4", 
      "hd":true 
     } 

    ] 
} 

「画像」と「テキスト」の定義は、同じスキーマに含まれていますが、彼らは他の場所で

{ "id": "http://x.y.z/fs-schema.json", "definitions": { "file": { "type": "object", "properties": { "name": { "type": "string" }, "fileType": { "type": "string", "format": "uri" } } }, "image": { "allOf": [ { "$ref": "#definitions/file" }, { "properties": { "width": { "type": "integer" }, "height": { "type": "integer"} } } ] }, "text": { "allOf": [ { "$ref": "#definitions/file" }, { "properties": { "lineCount": { "type": "integer"}}} ] } }, "type": "object", "properties": { "name": { "type": "string"}, "content": { "type": "array", "items": { "allOf": [ { "$ref": "#definitions/file" }, { *"$refFromProperty"*: "fileType" } // the magic thing ] } } } } 

を定義するかもしれない「擬似」スキーマ
なお、
+0

説明が必要です。ディレクトリデータが定義されているときに定義されている特定のプロパティをフルフィルにするように、ディレクトリ内のすべてのファイルアイテムを設計したいと思っています。 – jruizaranguren

+0

プロパティファイルタイプ – redben

答えて

9

JSONスキーマの検証部分だけではこれを行うことはできません。これは固定構造を表します。あなたが望むのはバリデーション時にスキーマの解決/参照が必要です。

しかし、あなたはJSONのHyper-スキーマを使用してこれを表現することができ、かつrel="describedby"リンク:だからここ

{ 
    "title": "Directory entry", 
    "type": "object", 
    "properties": { 
     "fileType": {"type": "string", "format": "uri"} 
    }, 
    "links": [{ 
     "rel": "describedby", 
     "href": "{+fileType}" 
    }] 
} 

、それは"fileType"から値を取り、関係「describedbyの」とのリンクを計算するためにそれを使用しています - つまり、「この場所のスキーマは現在のデータも記述します」という意味です。

ほとんどのバリデーターはリンク(「describedby」を含む)の通知を受けないという問題があります。あなたは "ハイパーバリデータ"を見つける必要があります。

UPDATEtv4ライブラリには、私はcloudfeet答えは有効な解決策だと思う機能

+0

からサブタイプのファイルについて適切な定義を選びたいと思っています。おかげさまで、これはやっているようですが、あなた自身が言うように「ハイバリデーター」を見つけなければなりません。 – redben

+0

ありがとうございますcloudfeet!それは私が探している答えです。記述されたスキーマを維持しましょう。私はURIを計算するために補間法を使用していますが、上記のように、describeBy relのhref値の補間も使用できると仮定しています。答えを投稿してくれてありがとう! –

+0

これをサポートしているJSのバリデータを知っていますか? –

3

としてこれを追加しました。あなたは同じアプローチdescribed hereを使うこともできます。

定義するすべてのサブタイプを「anyOf」にすることができるファイルオブジェクトタイプがあります。それぞれのサブタイプに対して参照および検証を行えるようにするには、enumを使用します。

サブタイプのスキーマが同じJson-Schemaファイル内にある場合、 "$ ref"で明示的にuriを参照する必要はありません。正しいdraft4バリデーターがenum値を見つけ、Json-Schemaツリー内のその "サブスキーマ"に対して検証しようとします。

draft5(進行中)では、より明示的な方法で代替案を表現できる「switch」ステートメントが提案されました。

+1

わからないのでEnumはオプションではありませんオーサリング時にすべての可能なサブタイプ。私は "イメージ"と "テキスト"を知っていますが、誰かが別のスキーマで "ファイル"のサブタイプを追加するかもしれません。 OOPでは "file"をマップすると、インタフェースまたは抽象APIクラスにマップされます。 – redben

+0

これに問題はありません。インタフェースを拡張するインタフェースは追加のenum値の情報を持ち、拡張されたenum値の情報をOOP内で同じように実行することができます。 – jruizaranguren

+0

私は理解しているとは思わない。サブタイプの(fileType)プロパティにenumを使用すると、okですが、スキーマは望ましくない "fileType"の値を検証します... 一方、 "OOPは拡張されたものです。エクステンション "。ベース抽象クラスの独自の拡張を作成したり、インタフェースを実装するために他の拡張機能が何であるかを知る必要はありません:) – redben

関連する問題