Как смоделировать сложную схему без особых повторений, используя JsonSchema? - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь смоделировать документы (например, паспорт) и их атрибуты (имя, дату рождения и т. Д.) И описать их, используя json schema.

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

Допустим, у меня есть паспорт, его модель выглядит следующим образом:

{
  "owner":  "<string>",
  "type" :  "<string>",
  "salt" :  <number>,
  "attributes": {
    "number"     : {"value": "<string>",     "salt": <number>}
    "lastName"   : {"value": "<string>",     "salt": <number>},
    "firstName"  : {"value": "<string>",     "salt": <number>},
    "birthDate"  : {"value": "<date>",       "salt": <number>},
    "nationality": {"value": "<string>",     "salt": <number>},
  }
}

Каждый атрибут имеет «значение» и «соль», но «значение» отличается для каждого ключа (имя атрибута). Мой вопрос: как будет выглядеть схема для этого типа документа JSON?

UPD : каждый атрибут имеет value и salt. Соль абсолютно одинакова для всех атрибутов, но value отличается. Если я вручную укажу, что каждый атрибут имеет salt и value, то я получу огромное дублирование схемы Можно ли этого избежать?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Есть много вещей, которые вы можете сделать, чтобы уменьшить дублирование в вашей схеме. Одним из способов является использование ключевого слова definitions. Другой вариант - использовать patternProperties для проверки общих ограничений для нескольких свойств.

{
  "type": "object",
  "properties": {
    "owner": { "type": "string" },
    "type": { "type": "string" },
    "salt": { "$ref": "#/definitions/salt" },
    "attributes": {
      "type": "object",
      "patternProperties": {
        ".*": {
          "type": "object",
          "properties": {
            "salt": { "$ref": "#/definitions/salt" }
          },
          "required": ["value", "salt"]
        }
      },
      "properties": {
        "number": { "$ref": "#/definitions/string-value" },
        "lastName": { "$ref": "#/definitions/string-value" },
        "firstName": { "$ref": "#/definitions/string-value" },
        "birthDate": { "$ref": "#/definitions/date-value" },
        "nationality": { "$ref": "#/definitions/string-value" }
      }
    }
  },
  "definitions": {
    "salt": { "const": 1234 },
    "string-value": {
      "properties": {
        "value": { "type": "string" }
      }
    },
    "date-value": {
      "properties": {
        "value": { "type": "string", "format": "date" }
      }
    }
  }
}
0 голосов
/ 28 июня 2018

В черновике JSON Schema-7 (текущем на момент написания), предполагая, что вы захотите использовать ссылки на другой файл, содержащий определения ваших свойств, вы можете сделать что-то вроде следующего.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "number": {
      "properties": {
        "value": {...}, # Whatever you define as your schema for number/value.
        "salt": {
          "$ref": "externalRef/definitions/salt"
        }
      }
    }
  }
}
...