После некоторого изучения я пришел к следующему ответу:
Лучший способ увидеть это в действии — найти несколько примеров. Бывает, что в самой схеме draft04 есть несколько примеров этого (определения, свойства, patternProperties,...), и они обычно следуют тот же узор.
Например, свойство definitions схемы draft04 определяет, что должно отображаться в схеме в свойстве definitions. Вот подсхема, связанная со свойством definitions:
"definitions": {
"type": "object",
"additionalProperties": { "$ref": "#" },
"default": {}
},
Это говорит о том, что запись в "#/definitions/" должна быть объектом. Тот факт, что это объект json, означает, что он сам будет иметь уникальные ключи. Теперь, что касается значений в объекте, это то, что описывает additionalProperties. В данном случае это говорит о том, что значение каждого свойства само должно соответствовать корню схемы "#". Это означает, что каждое значение в объекте свойства definitions допустимого объекта схемы json также должно быть схемой. Если бы это было набрано как C++, это могло бы выглядеть так:
std::map< std::string, Schema > definitions;
По сути, карту со строковым ключом можно рассматривать как объект json со структурированным типом значения. Итак, для создания собственного:
std::map< std::string, T >
Сначала определите схему для T. Например:
"definitions" : {
"movie" : {
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
}
}
Для сохраненного типа значения T решите, хотите ли вы разрешить какие-либо свойства, если эти указанные свойства имеют тип, указанный выше. Если вам нужны только эти свойства, добавьте "additionalProperties" : false
"definitions" : {
"movie" : {
"additionalProperties" : false,
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
}
}
Также решите, действительно ли вам требуется, чтобы все свойства присутствовали, чтобы фильм был действительным. Если это так, добавьте обязательную запись.
"definitions" : {
"movie" : {
"additionalProperties": false,
"required" : [ "title", "year_made", "rating" ],
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
},
Теперь форма T для фильма определена. Создайте определение для коллекции или карту фильмов, ссылающихся на схему фильма, определенную, как это было сделано с помощью определений в черновике схемы. Примечание: в "movie_map" дополнительные свойства имеют другое значение, чем значение "movie". В случае "movie" это логическое значение false, указывающее на отсутствие дополнительных свойств помимо тех, что перечислены в properties. В случае "movie_map" это означает - если есть дополнительные свойства, они должны выглядеть как эта схема. Но, поскольку в movie_map не указано никаких свойств, на самом деле это означает, что все свойства в экземпляре объекта должны соответствовать #/definitions/movie. Теперь все значения в "movie_map" будут выглядеть как определенная схема movie.
{
"definitions" : {
"movie" : {
"additionalProperties": false,
"required" : [ "title", "year_made", "rating" ],
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
},
"movie_map" : {
"type": "object",
"additionalProperties": { "$ref": "#/definitions/movie" },
"default": {}
}
}
}
Теперь используйте определенную схему movie_map где-нибудь внутри схемы:
{
"title" : "movie data",
"additionalProperties" : false,
"required" : [ "movies" ],
"properties" : {
"movies" : { "$ref" : "#/definitions/movie_map" }
},
"definitions" : {
"movie" : {
"additionalProperties": false,
"required" : [ "title", "year_made", "rating" ],
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
},
"movie_map" : {
"type": "object",
"additionalProperties": { "$ref": "#/definitions/movie" },
"default": {}
}
}
}
Вот пример объекта, который можно рассматривать как карту фильмов, который проверяется на соответствие схеме:
{
"movies" : {
"the mission" : {
"title":"The Mission",
"year_made":1986,
"rating":5
},
"troll 2" : {
"title":"Troll 2",
"year_made":1990,
"rating":2
}
}
}
person
user1338952
schedule
30.08.2013