web-dev-qa-db-ja.com

JSONスキーマで「If」「then」「else」条件を使用するにはどうすればよいですか?

JSONスキーマ(draft-07)への比較的新しい追加により、if、then、およびelseキーワードが追加されます。これらの新しいキーワードを正しく使用する方法がわかりません。これまでのJSONスキーマは次のとおりです。

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "string"
    }
  },
  "if": {
    "properties": {
      "foo": {
        "enum": [
          "bar"
        ]
      }
    }
  },
  "then": {
    "required": [
      "bar"
    ]
  }
}

「foo」プロパティが「bar」に等しい場合、「bar」プロパティが必要です。これは期待どおりに機能します。

ただし、「foo」プロパティが存在しないか、入力が空の場合、何も必要ありません。これを達成する方法は?

empty input {}.

見つかったエラー:
オブジェクト:barに必要なプロパティがありません。スキーマパス:#/ then/required

私はオンライン検証ツールを使用します:

https://www.jsonschemavalidator.net/

9
Mohammad Irfan

ifキーワードは、値スキーマの結果が検証に合格した場合、thenスキーマを適用し、それ以外の場合はelseスキーマを適用することを意味します。

ifスキーマで"foo"を要求する必要があるため、スキーマが機能しませんでした。そうしないと、空のJSONインスタンスがifスキーマの検証に合格し、したがってthenスキーマ。"bar"が必要です。

次に、"propertyNames":falseが必要です。これは、常に検証に失敗する"else": falseを設定する場合とは異なり、スキーマにキーが含まれないようにします。

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "string"
    }
  },
  "if": {
    "properties": {
      "foo": {
        "enum": [
          "bar"
        ]
      }
    },
    "required": [
      "foo"
    ]
  },
  "then": {
    "required": [
      "bar"
    ]
  },
  "else": false
}
7
Relequestual

「else」プロパティだけを使用することはできませんか?

{
    "type": "object",
    "properties": {
        "foo": { "type": "string" },
        "bar": { "type": "string" }
     },
     "if": {
        "properties": {
            "foo": { 
              "enum": ["bar"] 
            }
        }
    },
    "then": { 
      "required": ["bar"]
    },
    "else": {
      "required": [] 
    }
}
0
S. Miranda