いくつかの研究の後、私は次の答えを思いつきました:
これを実際に見る最善の方法は、いくつかの例を見つけることです。たまたま、draft04 スキーマ自体 ( definitions、properties、patternPropertiesなど)にこの例がいくつかあり、通常は同じパターンに従います。
たとえば、draft04 スキーマの定義プロパティは、定義プロパティでスキーマに表示する必要があるものを定義します。定義 プロパティに関連付けられたサブスキーマは次のとおりです。
"definitions": {
"type": "object",
"additionalProperties": { "$ref": "#" },
"default": {}
},
これは、「#/definitions/」のエントリがオブジェクトでなければならないことを示しています。json オブジェクトであるということは、それ自体が一意のキーを持つことを意味します。オブジェクトの値については、それがadditionalPropertiesが記述するように設計されています。この場合、各プロパティの値自体がスキーマ「#」のルートに準拠する必要があることを示しています。これが意味することは、有効な 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」のadditionalPropertiesは、「movie」とは異なる意味を持ちます。"movie" の場合、これは boolean falseであり、 properties
にリストされているもの以外に追加のプロパティがないことを示し
ます。「movie_map」の場合は、追加のプロパティがある場合、このスキーマのように見える必要があることを意味します。ただし、movie_mapにはプロパティが指定されていないため、これは、オブジェクト インスタンスのすべてのプロパティが #/definitions/movie に準拠する必要があることを意味します。これで、「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": {}
}
}
}
次に、スキーマ内のどこかで定義済みのスキーマ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": {}
}
}
}
これは、スキーマに対して検証する映画のmapと考えることができるサンプル オブジェクトです。
{
"movies" : {
"the mission" : {
"title":"The Mission",
"year_made":1986,
"rating":5
},
"troll 2" : {
"title":"Troll 2",
"year_made":1990,
"rating":2
}
}
}