条件付きJSONスキーマ検証を行う方法[重複]

Aug 24 2020

次のスキーマを作成しました:

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "enum": [
        "full",
        "partial"
      ]
    }
  },
  "required": [
    "name"
  ],
  "if": {
    "properties": {
      "name": {
        "const": "full"
      }
    }
  },
  "then": {
    "properties": {
      "status": {
        "type": "string",
        "enum": [
          "success",
          "failure"
        ]
      }
    },
    "required": [
      "status"
    ]
  },
  "else": {
    "properties": {
      "status": {
        "type": "string",
        "enum": [
          "success",
          "failure",
          "partial success"
        ]
      },
      "message": {
        "type": "string"
      },
      "created": {
        "type": "array",
        "items": [
          {
            "type": "integer"
          }
        ]
      },
      "deleted": {
        "type": "array",
        "items": [
          {
            "type": "integer"
          }
        ]
      }
    },
    "required": [
      "name",
      "status",
      "created",
      "deleted"
    ]
  }
}

キー「name」に基づいて、キーのサブ検証が異なる「full」と「partial」の2種類のjsonを作成しようとしています

したがって、可能な2つのサンプルの有効なjsonは次のとおりです。

名前が「フル」の場合

{"name": "full", "status": "success"}

名前が「部分的」の場合

{
"name": "partial",
"status":"success",
"created": [6],
"deleted": [4]
}

Pythonでこのスキーマを使用して検証する場合、if / then / elseの部分は検証されません。

validator = Validator(json.load(open(path, 'r')))
validator.validate({"name": "full"})
[]
validator.validate({"name": "full", "status": "success"})
[]

最初の1つは無効であるはずですが、両方とも有効として表示されます。

同様に、2番目のjsonの場合、無効なjsonでも失敗しません。

validator.validate({"name": "partial"})
[]
validator.validate({"name": "partial", "stauts": "success", "created": [6], "deleted": [4]})
[]

Pythonバリデーターコード:

class Validator(object):
    def __init__(self, schema):
        self.schema = schema

    def validate(self, json):
        validator = Draft4Validator(self.schema)
        errors = sorted(validator.iter_errors(json), key=str)
        return errors

回答

1 RobbyCornelissen Aug 24 2020 at 15:53

JSONスキーマドラフト4バリデーターを使用していますが、条件付きサブスキーマはドラフト7でのみ追加されています。

ここでテストすると、スキーマ自体は正常に機能します。バージョン管理されたバリデーターをからDraft4Validatorに変更する必要がありますDraft7Validator