2017-10-09 15 views
1

必要: "A" することができjsonschemaの検証は、条件付きで、私はいつも2つの特性を有するJSONオブジェクトを検証する必要が

  • タイプ

タイプを、

タイプが "A"である場合、プロパティ "foo"も必須であり、追加のプロパティは許可されません。

OK:

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
} 

ないOK:タイプが "B" であるとき、

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 

プロパティ "バー" が要求され、追加のプロパティが許可されません。

タイプが "C"の場合、プロパティ "bar"が必須で、必要に応じて "zen"プロパティも存在できます。

OK:

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "zen": "a" 
} 

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
} 

ないOK:

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "lol": "a" 
} 

残念ながら、このquestionに優れた答えは部分的に私の場合をカバーする、しかし私は、私の作品jsonschemaを構築するために管理されていませんでした。

編集:

これは私が試みたものです。

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "object", 
    "properties": { 
     "type": { 
      "type": "string", 
      "enum": ["A", "B", "C"] 
     }, 
     "name": {"type": "string"}, 
     "foo": {"type": "string"}, 
     "bar": {"type": "string"}, 
     "zen": {"type": "string"}, 
    }, 
    "anyOf": [ 
     { 
      "properties": {"type": {"enum": ["A"]}}, 
      "required": ["foo"], 
     }, 
     { 
      "properties": {"type": {"enum": ["B"]}}, 
      "required": ["bar"], 
     }, 
     { 
      "properties": {"type": {"enum": ["C"]}}, 
      "required": ["bar"], 
     }, 
    ] 
} 

私の問題は、「anyOf」内のオブジェクトの内部でfalseにフィールド「additionalpropertiesを」を設定することは私に期待される結果が得られていないということです。それは付加的な特性を有しているにもかかわらず、

例えば以下のJSONは「笑」

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 
+0

私が試した例とこのソリューションが私にとってはうまくいかない理由を含むように投稿を更新しました – cunfusu

答えて

0

を検証に合格JSONスキーマは、各サブスキーマの制約が別々に評価される拘束システムです。つまり、 "additionalProperties"は同じ即時スキーマオブジェクト内の "プロパティ"または "patternProperties"のみを見ることができます。

さらに、「必須」に基づいてプロパティを表示することはできません。「プロパティ」および「パターンプロパティ」にのみ適用されます。

"additionalProperties"を設定していた場合は:の中のany0fの各ブランチには、唯一許可されているプロパティが "タイプ"であるため動作しません。あなたがそれを行い、 "タイプ"以外のプロパティを許可しているなら、私はあなたが使っている実装を知りたいでしょう。

+0

基本的に私が必要とする厳密なスキーマを実装する唯一の方法は、anyOfを正確に検証するスキーマのリスト私は必要がある、私はいくつかのプロパティを再利用したいが、これは不可能と思われる。 – cunfusu

+0

ドラフト04では、はい、正しいです。 –

+0

draft-06では、 'propertyNames'で再利用することができますが、それは信じられないほど簡潔です。 –

関連する問題