web-dev-qa-db-ja.com

配列の項目プロパティがJsonスキーマで一意であることを確認しますか?

次のJSONスキーマの場合、「name」プロパティが一意であることを示すことは可能です(つまり、「elements」配列に同じ「name」を持つ2つのアイテムがあってはなりません。

{
  "root": {
    "type": "object",
    "properties": {
      "elements": {
        "type": "array",
        "minItems": 1,
        "items": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "title": "Element Name",
              "minLength": 3,
            },
            "url": {
              "type": "string",
              "title": "Some URL"
            }
          }
        }
      }
    }
  }
}

niqueItems キーワードを使用しようとしましたが、単純な値のリスト用に設計されているようです。

26
begie

いいえ、できません。ドキュメントから、json-schema:... JSONデータの構造を定義するためのJSONベースのフォーマット。

これは規格の目的ではないため、データ値の検証を行うにはかなり制限されています。ある種の「一意のID」機能を要求するのが一般的であるため、以前に多くの人がこれを要求しました。残念ながら、それを必要とする人にとって、json-schemaはそれを提供しません。

したがって、一意性を確保したい場合、唯一のオプションは、プロパティ値ではなく「名前」をプロパティキーとして持つことです。

23
jruizaranguren

データ構造のリファクタリングがオプションである場合、次のアプローチが役立つ場合があります。

  • アレイをマップで置き換えます。これは、patternPropertiesを含むオブジェクトを使用することで簡単に実現できます。パターンは正規表現です。パターンに一致するすべてのオブジェクトは、パターンプロパティのスキーマに対して検証されます。 3文字以上の文字列に一致するパターンは、次のようになります:"....*"、しかし末尾のようです".*"は常に暗示されるため、"..."も機能します。
  • AdditionalProperties:falseを追加すると、制約(minLength:3)。
  • マップに少なくとも1つの要素を適用するには(minItems:1 for your array)、minItemsminPropertiesに置き換えます。

...以下のスキーマになります:

"root": {
  "type": "object", 
  "properties": {
    "elements": {
      "type": "object", 
      "patternProperties": {
        "...": {
          "type": "object", 
          "properties": {
            "url": {
              "type": "string"
            }
          }
        }
      }, 
      "additionalProperties": false, 
      "minProperties": 1
    }
  }
}

次のようなドキュメント(抜粋)が古いスキーマと一致していた場合、

"elements": [
  {
    "name": "abc", 
    "url": "http://myurl1"
  }, 
  {
    "name": "def", 
    "url": "http://myurl2"
  }, 
  {
    "name": "ghij", 
    "url": "http://myurlx"
  }
]

...そのようなドキュメント(抜粋)は新しいスキーマに一致します。

"elements": {
  "abc": {
    "url": "http://myurl1"
  }, 
  "def": {
    "url": "http://myurl2"
  }, 
  "ghij": {
    "url": "http://myurlx"
  }
}
7
yaccob

ユースケースが追加されたオーバーヘッドを処理できる場合は、ドキュメントに変換を適用して縮小されたドキュメントを生成し、縮小されたドキュメントに別のミニスキーマを使用して検証を再度適用できます。

以下は、Json変換ツールに関する情報とのリンクです。

JSONataでは、サンプルケースの処理は非常に簡単です。

1
Basel Shishani