オブジェクトの設定

type:objectを置くとオブジェクトを期待するという意味になります。期待するプロパティやその値を絞り込むオプションがいくつかあります。

特定のプロパティ時の期待値の設定

propertiesを置き、その中でそれぞれのプロパティ名とその名前の時のスキーマを設定できます。

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "number"
    },
  }
}

これは以下のような意味になります。

  • まず、オブジェクトです
  • そのオブジェクトがfooを持つならそれは文字列です
  • そのオブジェクトがbarを持つならそれは文字列です
  • そのオブジェクトがbazを持つならそれは型は何でもいいです

なので以下は通ります。

{
  "foo": "foo",
  "baz": false
}

厳密なプロパティ

additionalProperties:falsepropertiesと共に置くことで、完全にproperitesのプロパティ構造以外のプロパティは禁止されるようになります。つまり、先程は設定できたbazは駄目になるという事です。

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "number"
    },
  },
  "additionalProperties": false
}

やや厳しく

additionalProperties:<設定>propertiesに置いていないプロパティの期待する型を絞ることができます。例えば以下はfooプロパティ以外の値はnumberを期待するスキーマの例です。

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    },
  },
  "additionalProperties": {
    "type": "number"
  }
}

絶対定義してほしいプロパティ

reuiqred:<properties>propertiesと共に置くとここで羅列したプロパティ名は必須項目という意味になります。例えば以下は「fooは絶対に定義してね」という意味になります。

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "number"
    },
  },
  "required": [
    "foo"
  ]
}

依存関係のプロパティ

先程から何度か「reuiqred:<properties>propertiesと共に置くと...」のように言っていますが、このように「requiredpropertiesが存在するなら設定できる」ような関係を設定できるオプションがあります。

これはdependenciesを置きます。これはこのプロパティは: [これらのプロパティに依存する]というような感じで置きます。

例えば以下はbarを置くなら必ずfooを定義しなければならないというスキーマの例です。

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "number"
    },
  },
  "dependencies": {
    "bar": ["foo"]
  }
}

プロパティ名のパターン

propertyNames: {pattern:<pattern>}を置くとプロパティ名はそのパターンにマッチするものだけ期待するという意味にできます。以下はcolor.orangecolor.blueなどcolor.からはじまるプロパティだけを期待する例です。

{
  "type": "object",
  "propertyNames": {
   "pattern": "^color\\."
  }
}

プロパティの数

minProperties:<number>maxProperties:<number>を置くことでそれぞれ、「これ以上はプロパティ数を置いてほしい」、「これ以下にプロパティ数を抑えてほしい」という意味にできます。

{
  "type": "object",
  "minProperties": 2,
  "maxProperties": 3
}