2017-11-17 14 views
0

特定の配列要素が必要です:私はsymbolic-name="displayName"JSONスキーマは、私はJSONスキーマなどの属性のリストを定義し

と正確に一つの属性を持っているリストを要求したい

{ 
    "$schema": "http://json-schema.org/schema#", 
    "type": "object", 


    "definitions": { 

    "attribute": { 
     "type": "object", 
     "properties": { 
     "symbolic-name": { "type":"string"}, 
     "value": { "type":"string"} 
     }, 
     "required": ["symbolic-name", "value"] 
    }, 

    "displayname": { 
     "type": "object", 
     "properties": { 
     "symbolic-name": {"enum":["displayName"]}, 
     "value": { "type":"string"} 
     }, 
     "required": ["symbolic-name", "value"] 
    } 

    }, 

    "properties": { 
    "attributes":{ 
     "type": "array", 
     // This is the crucial point: 
     "items": {"oneOf": [ 
       {"$ref": "#/definitions/attribute"}, 
       {"$ref": "#/definitions/displayname"} 
     ]}, 
     "uniqueItems": true 
    } 
    } 
} 

を有効なデータオブジェクトは次のようになります:

{ 
    "attributes":[ 
    {"symbolic-name": "displayName", "value": "Display Name"}, 
    {"symbolic-name": "somethingElse", "value": "value1"} 
    {"symbolic-name": "somethingElse", "value": "value2"} 
    ] 
} 

displayName属性が "oneOf"と一致するだけでなく、両方の制限にも一致するため、これは検証できません。私はそれを "allOf"に変更することはできません。なぜなら、displayNameのそばの他のすべての属性はもはや一致しないからです。

答えて

1

"oneOf"が機能するには、「属性」と「表示名」のスキーマが書かれているように相互排他的である必要があります。有効な「表示名」も有効な「属性」です。

"symbolic-name": { 
    "type": "string", 
    "not": {"enum": ["displayName"]} 
} 

今「のdisplayName」のシンボル名を持つ要素は、「表示名」の定義を一致させることができますが、「一致しません:私たちは、「属性」の有効なシンボル名として「のdisplayName」を除外していることを行うことができます属性 "の定義。

あなたの質問のもう1つの部分は、あなたの配列に正確に1つの "displayname"を持つことです。これはやっかいです。また、使用しているJSONスキーマのドラフトにも依存します。 4と6が実装され、7が月曜日にリリースされました。"$schema": "http://json-schema.org/schema#"は、最新のものを使用していることを意味します。これは、7となります。$schemaの特定の草案を、番号なしの代わりに使用することをお勧めします。 。あなたは、配列の最初要素である「表示名」を必要としてOKであれば

、これは任意のドラフトで動作します(あなたも"oneOf"必要はありません):

"items": [{"$ref": "#/definitions/displayname"}], 
"additionalItems": {"$ref": "#/definitions/attribute"} 

ここでは"items"が配列であることに注意してください。これは、最初の項目が "表示名"でなければならず、その最初の項目を超えるすべての追加項目が "属性"でなければならないことを意味します。

「表示名」を任意の位置で許可したい場合は、それが難しくなります。ドラフト06の時点で、"contains"があります。これには、指定されたスキーマに一致する項目が少なくとも1つ必要です。しかし、「最大で1つのアイテム」と言っても簡単な方法はありません。しかし、"minContains""maxContains"はドラフト-08のために提案されてきた。今のところhttps://github.com/json-schema-org/json-schema-spec/issues/441

をそれがすべてのドラフトで動作するよう、うまくいけば、あなたは、「表示名」された最初の位置を必要とOKです。

関連する問題