0

スキーマ検証を変更して、特定のオブジェクトに最も適したスキーマを見つける方法を見つけようとしています。スキーマがあるとしましょう:

{
  "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"]
    }
  }
}

ここで、 object がある場合、このスキームに対して実際には有効でなくても{ "prop1": "y" }、タイプとして解決されるようにします。#/definitions/bつまり、prop1プロパティのみを使用して解決したいのです。

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

4

1 に答える 1

1

目的が正しいスキーマからのエラーのみを報告することである場合は、「switch」 (v5 オプションを使用すると、バージョン 5.0.0 からajv-keywordsに移動されます) または「if/then/else」 (次のように推奨されます) のいずれかを使用できます。 JSON スキーマ ドラフトに追加される可能性があります 7):

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

検証に使用されたスキーマを知る必要がある場合は、カスタム キーワードを使用してメモを取ることができます。

{
  "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
于 2017-01-04T15:20:32.600 に答える