16

こんにちは、よろしくお願いします。

1 つの A および B オブジェクトと NC オブジェクトを含むように配列を強制する JSON スキーマを作成しようとしています。ここで、A と B は C オブジェクトであり、N は 0 から無限大までの整数です。

そのため:

[A, B] [A, B, C1] [A, B, C1, .., CN]

ただし、すべて有効です。

[A] [A, C1] [A, C1, .., CN]

無効です。

明確にするために、A と B が存在する必要があります。C オブジェクトはオプションですが、好きなだけ持つことができます。

C オブジェクト スキーマ:


{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "C Object",

  "type": "object",
  "required": ["id", "name"],

  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string"
    }
  },
  "additionalProperties": false
}

したがって、C オブジェクトは、プロパティ「id」と「name」のみを含む任意の有効な JSON オブジェクトです。ここで、「id」は整数で、「name」は文字列です。

A および B オブジェクト スキーマ:


{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "A Object",

  "type": "object",
  "required": ["id", "name"],

  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string",
      "enum": ["A"]
    }
  },
  "additionalProperties": false
}

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "B Object",

  "type": "object",
  "required": ["id", "name"],

  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string",
      "enum": ["B"]
    }
  },
  "additionalProperties": false
}

A および B オブジェクトは、名前の値が適用されるという点で C オブジェクトとは異なります。A オブジェクトの名前の値は、フィールド enum に含まれる値である必要があります。ここで、enum には単一の値が含まれます。

これまでで最も完全なスキーマは次のとおりです。


{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "To Date Solution",
  "description": "So far this is the most complete attempt at enforcing values to be contained within a JSON structure using JSON schemas.",

  "type": "array"
  "items": {
    "allOf": [
      {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "C Object",

        "type": "object",
        "required": ["id", "name"],

        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    ]
  }
}

これにより、含まれるすべてのオブジェクトが A と B であるタイプ C でなければならないことが強制されますが、A と B の少なくとも 1 つのインスタンスが私の配列に含まれるようにする方法はわかりません。

4

2 に答える 2

1

私の問題を解決するソリューションを決定しました。A と B が配列内に存在することを強制しますが、位置的には存在するため、検証中の JSON オブジェクトを何らかの方法で順序付けする必要があります。

作業スキーマ


{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Order dependent solution",

  "type": "array",
  "items": [
    {
      "$schema": "http://json-schema.org/draft-04/schema#",
      "title": "A Object",

      "type": "object",
      "required": ["id", "name"],

      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string",
          "enum": ["A"]
        }
      },
      "additionalProperties": false
    },
    {
      "$schema": "http://json-schema.org/draft-04/schema#",
      "title": "B Object",

      "type": "object",
      "required": ["id", "name"],

      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string",
          "enum": ["B"]
        }
      },
      "additionalProperties": false
    }
  ],

  "additionalItems": {

    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "C Object",

    "type": "object",
    "required": ["id", "name"],

    "properties": {
      "id": {
        "type": "integer"
      },
      "name": {
        "type": "string"
      }
    },
    "additionalProperties": false  
  }

}

この JSON スキーマは、インデックス 0 の A オブジェクト、インデックス 1 の B オブジェクト、および残りのすべての要素を構成する C オブジェクトを含む JSON 配列を検証します。このソリューションは使用可能であり、開発を進めることができますが、順序に依存しないソリューションが好まれます。

どんな助けでも大歓迎です!:)

PS - これらのスキーマは最適化されておらず、「id」および「$ref」キーワードを使用して最終バージョンで削除する冗長性を示しています。

于 2013-11-06T13:58:20.923 に答える