2017-01-04 5 views
0

スキーマの検証を変更して、特定のオブジェクトに最も適切なスキーマを見つける方法を探しています。我々は、スキーマを持っているとしましょう:AJVで無効なオブジェクトのスキーマをカスタマイズする

{ 
    "oneOf": [ 
    { 
     "$ref": "#/definitions/a" 
    }, 
    { 
     "$ref": "#/definitions/b" 
    } 
    ], 
    "definitions": { 
    "a": { 
     "type": "object", 
     "properties": { 
     "prop1": { 
      "enum": ["x"] 
     } 
     }, 
     "required": ["prop1"] 
    }, 
    "b": { 
     "type": "object", 
     "properties": { 
     "prop1": { 
      "enum": ["y"] 
     }, 
     "prop2": { 
      "type": "string" 
     } 
     }, 
     "required": ["prop1", "prop2"] 
    } 
    } 
} 

を今、私はオブジェクト{ "prop1": "y" }を持っている場合、私はそれがこのスキームのために本当に有効でない場合でも、それは#/definitions/bタイプのように解決することにしたいです。つまり、解決のためにちょうどprop1プロパティを使用したいと思います。

スキーマ自体を再構築することなく、AJVカスタムキーワードを使用してそれを行う方法があるのだろうか?特に、スキーマがオブジェクトに対して有効でない場合、カスタムキーワードを使用してそれをオーバーライドして有効にすることは可能ですか?目的が唯一の正しいスキーマからエラーを報告する場合は、使用することができます

答えて

1

いずれか"switch"または"if/then/else"(V5オプションを指定して、それはバージョン5.0.0からajv-keywordsに移動された)(追加される可能性があるとして推奨されます

あなたが検証に使用したスキーマ知っておく必要がある場合は、それをメモしておくために、カスタムキーワードを使用することができます:)JSONスキーマドラフト7に

{ 
    "id": "schema", 
    "if": { "properties": { "prop1": { "const": "x" } } }, 
    "then": { 
    "allOf": [ 
    { "schemaUsed": "schema#/definitions/a" }, 
    { "$ref": "#/definitions/a" } 
    ] 
    }, 
    "else": { 
    "allOf": [ 
    { "schemaUsed": "schema#/definitions/b" }, 
    { "$ref": "#/definitions/b" } 
    ] 
    } 
} 

キーワードが定義されなければなりませんスキーマを格納する検証の後、どの変数が使用されたかを確認できるように、いくつかの変数で検証中にIDを使用します。

あなたが行うことができます実際のスキーマを取得する必要がある場合:

var validate = ajv.getSchema('schema#/definitions/a'); // validating function 
var schema = validate.schema; // schema as JSON 
+0

をそれは私が怖い、助けにはなりません。一般的な目的は、スキーマに従ってJSONオブジェクトを編集するためのUIを構築することです。したがって、スキーマに 'oneOf'がある場合、私はどのような変種を選ぶべきかを知る必要があります。問題は、オブジェクトが不完全なために現在無効である可能性があります(必須フィールドが存在しないか、同じ方法でネストされたプロパティが無効な場合など)、何とかAJVをトリックする方法を見つける必要があります(適切なスキーマを解決するために1つのAJVインスタンスを使用し、実際の検証のために他のインスタンスを使用しています)、正しいスキーマを見つけることができます。 –

+0

Ajvはスキーマに対してデータを検証します。スキーマ(JSON)を取り、検証関数(コード)を作成しますが、このような「最終的な」スキーマなどはありません。 if/then/elseと一緒にカスタムキーワードを使用して、 "if"ブランチまたは "else"ブランチでどのスキーマが検証されているかを知らせたり、エラーからこの情報を導き出すことができます(検証が失敗した場合)。 – esp

+0

変更を参照してください – esp

関連する問題