jsonschema с пользовательским свойством - PullRequest
0 голосов
/ 25 октября 2018

Я хочу определить JsonSchema с customProperty в нем, это свойство следует некоторым правилам, поэтому для его проверки мне нужно определить JsonSchema, который будет проверять его.

Покаудалось описать это правильно, но он работает только для первого уровня атрибутов, и я хочу, чтобы он был рекурсивным ...

Из моего понимания это должно сработать, я, вероятно, допустил ошибку, которую не могувидите, и на данный момент я не знаю, является ли это ошибкой, невозможной или глупой ...

Я считаю, что переопределение каждого типа должно быть возможным, но, очевидно, я бы не стал.

Вот пример Json, который я хочу проверить

{
  "title": "TheObject",
  "type": "object",
  "properties": {
    "aString": {
      "type": "string",
      "myCustomProperty": {}
    },
    "anObjet": {
      "type": "object",
      "myCustomProperty": {},
      "properties": {
        "anotherObject": {
          "type": "object",
          "myCustomProperty": {}, //if this line is removed it still validates wich I don't want
          "properties": {}
        }
      }
    }
  }
}

, а вот JsonSchema, который я сделал до сих пор:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "title": {"type": "string"},
    "type": {"type": "string","enum": ["object"]},
    "properties": {
      "type": "object",
      "patternProperties": {
        ".*": {
          "$ref": "#/definitions/Field"
        }
      }
    }
  },
  "definitions": {
    "Field": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "myCustomProperty": {
          "$ref": "#/definitions/myCustomProperty"
        },
        "patternProperties": {
          "^(?!myCustomProperty).*": {
            "$ref": "#/definitions/Field"
          }
        }
      },
      "required": [
        "type",
        "myCustomProperty"
      ]
    },
    "myCustomProperty": {
        //Some rules
    }
  }
}

1 Ответ

0 голосов
/ 26 октября 2018

Я нашел решение, в конце концов я не далек от того, что хотел.

В моем определении «Поле» я описываю объект, который определяет объект, и мне не хватало «свойства "поле.В котором я должен был поместить свою рекурсивную ссылку.

Правильная jsonSchema следующая:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "title": {
      "type": "string"
    },
    "type": {
      "type": "string",
      "enum": [
        "object"
      ]
    },
    "properties": {
      "type": "object",
      "patternProperties": {
        ".*": {
          "$ref": "#/definitions/Field"
        }
      }
    }
  },
  "definitions": {
    "Field": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "myCustomProperty": {
          "$ref": "#/definitions/myCustomProperty"
        },
        "properties": {            <====================  here
          "type": "object",
          "patternProperties": {
            ".*": {
              "$ref": "#/definitions/Field"
            }
          }
        }
      },
      "required": [
        "type",
        "myCustomProperty"
      ]
    },
    "myCustomProperty": {/*rules*/}
  }
}

Пока все работает, как и ожидалось, но если у кого-то есть более элегантное предложение, пожалуйста, поделитесь!

...