JSON スキーマで必須項目を指定する場合のよくある間違い

Design Center は、JSON スキーマの Draft 3 と Draft 4 をサポートします。項目を required (必須) として指定する方法は、Draft 3 と Draft 4 では異なります。API 仕様で間違ったドラフトの宣言を混同して使用するとエラーとなります。

Draft 3 では、次のように各項目の定義中で required と指定します。

{
  "$schema": "http://json-schema.org/draft-03/schema#",
  "type": "object",
  "properties": {
    "pageNum": {
      "type": "integer",
      "title": "Page number",
      "description": "...",
      "default": 1,
      "required": true
    },
    "pageSize": {
      "type": "integer",
      "title": "Page size",
      "description": "...",
      "required": true,
      "default": 50,
      "enum": [
         10,
         20,
         30,
         40,
         50
         ]
      }
...

Draft 4 では、次のように項目の定義と同じレベルで配列を作成することによって required と指定します。

{
  "$schema": "http://json-schema.org/draft-4/schema#",
  "type": "object",
  "properties": {
    "pageNum": {
      "type": "integer",
      "title": "Page number",
      "description": "...",
      "default": 1
    },
    "pageSize": {
      "type": "integer",
      "title": "Page size",
      "description": "...",
      "default": 50,
      "enum": [
         10,
         20,
         30,
         40,
         50
         ]
      },
    "required": [
      "pageNum",
      "pageSize"
      ]
    },
...

Draft 4 の方法の別の例です。

{
  "$schema": "http://json-schema.org/draft-4/schema#",
  "type": "object",
  "properties": {
    "address": {
      "type": "object",
      "properties": {
        "streetAddress": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "required": [
          "streetAddress",
          "city"
        ]
      },
      "phoneNumber": {
...

スキーマで Draft 4 を使用すると宣言した後で Draft 3 の方法を使用した場合 (またはその逆の場合) には、単純にスキーマの宣言を変更するだけで通常は問題が解決します。たとえば、スキーマで Draft 3 を使用すると宣言してから Draft 4 の方法を使用してしまった場合は、スキーマの宣言を Draft 4 を参照するように変更します。

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub