2

スキーマの別の場所で指定された値型 T を持つ文字列をキーとする辞書またはマップにプロパティを指定する標準的な方法はありますか?

たとえば、キー タイプが映画の名前で、値タイプが映画に関する属性のセット (制作年、予算、総収入など) である、ユーザーのお気に入りの映画をモデル化するとします。

まず、必要な属性を含むnameプロパティとvalueプロパティを持つ型として MovieDataPair をモデル化できると思います。次に、マップはそれらの配列になります。ただし、その場合は、映画の名前が 1 回しか表示されないようにする特別な一意の制約が必要になります。

これをサポートするためのjsonスキーマ、またはそれに使用される標準パターンはありますか? json スキーマのサポートが組み込まれていない場合、他のスキーマ ソリューションはどうでしょうか?

4

3 に答える 3

5

いくつかの研究の後、私は次の答えを思いつきました:

これを実際に見る最善の方法は、いくつかの例を見つけることです。たまたま、draft04 スキーマ自体 ( definitionspropertiespatternPropertiesなど)にこの例がいくつかあり、通常は同じパターンに従います。

たとえば、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
    }
  }
}

ここに画像の説明を入力

于 2013-08-30T14:43:07.133 に答える