2017-12-22 25 views
0

私はJSONスキーマで作業していますが、これを正しく設計したかどうかは分かりません。JSONスキーマの検証のためのサブスキーマでの親スキーマの参照

私は "Data.json"と呼ばれる内部オブジェクトを参照する "Task.json"という親オブジェクトを持っています。今度は、 "Data.json"の必須プロパティが "Task.json"のプロパティによって異なるようにスキーマを検証できる方法が必要です。たとえば、Task.jsonに "action = create"が含まれている場合、 "action = update"は "a"、 "d"はdata.jsonのプロパティを "a"、 "b" 、 "e"。 "action"パラメータに応じて有効なプロパティを指定できるように、data.jsonの親オブジェクト(action)をどのように参照できるかわかりません。

例:

Task.json

{ 
    "oneOf":[ 
     { 
     "action":"create", 
     "data":"data.json" 
     }, 
     { 
     "action":"update", 
     "data":"data.json" 
     } 
    ] 
} 

Data.json

 { 
    "properties":{ 
     "a":{ 

     }, 
     "b":{ 

     }, 
     "d":{ 

     }, 
     "e":{ 

     } 
    }, 
    "oneOf":[ 
     { 
     "#/action":{ 
      "enum":[ 
       "create" 
      ] 
     }, 
     "required":[ 
      "a", 
      "b", 
      "c" 
     ] 
     }, 
     { 
     "#/action":{ 
      "enum":[ 
       "update" 
      ] 
     }, 
     "required":[ 
      "a", 
      "d", 
      "e" 
     ] 
     } 
    ] 
} 

答えて

0

あなたはとサブスキーマを参照10キーワード。あなたのケースは表現するのが少し複雑ですが、間違いなく実行可能です。ユースケースの詳細によっては、これを単純化する方法もあります。私はここで最も柔軟なデザインを見せています。

{ 
    "type": "object", 
    "properties": { 
    "action": { "enum": ["create", "update", "delete"] }, 
    "data": { 
     "type": "object", 
     "properties": { 
     "a": {}, 
     "b": {}, 
     "d": {}, 
     "e": {} 
     } 
    } 
    }, 
    "allOf": [ 
    { "$ref": "#/definitions/action-create-implies-abc" }, 
    { "$ref": "#/definitions/action-update-implies-ade" } 
    ], 
    "definitions": { 
    "action-create-implies-abc": { 
     "anyOf": [ 
     { "not": { "$ref": "#/definitions/action-create" } }, 
     { 
      "properties": { 
      "data": { "required": ["a", "b", "c"] } 
      }, 
      "required": ["data"] 
     } 
     ] 
    }, 
    "action-update-implies-ade": { 
     "anyOf": [ 
     { "not": { "$ref": "#/definitions/action-update" } }, 
     { 
      "properties": { 
      "data": { "required": ["a", "d", "e"] } 
      }, 
      "required": ["data"] 
     } 
     ] 
    }, 
    "action-create": { 
     "properties": { 
     "action": { "enum": ["create"] } 
     }, 
     "required": ["action"] 
    }, 
    "action-update": { 
     "properties": { 
     "action": { "enum": ["update"] } 
     }, 
     "required": ["action"] 
    } 
    } 
} 
+0

私は上記のスキーマを検証しようとしましたが、 "定義"の "プロパティ"内の "必須"を無視しているようです。テスト目的のために、 "required"を "enum"に更新し、anyOfの "properties"の内部を検証するように見えます。 「必須」のようなものは、定義/プロパティの内部では機能しません。 – user5879804

+0

あなたは何を言おうとしているのか分かりません。しかし、このような音は別の質問かもしれませんか?私にとって最良の方法は新しい質問をするかもしれない。 – Jason

0

ありがとうございました!あなたの例は素晴らしく、元のデザインを再考することができます。

Data.json内に「MetaData.json」があり、「作成」に「Data.json」と「a」「b」と「c」が必要な別のレイヤーが追加されました。 "Metadata.json"が必要な場合は、 "a"、 "d"、 "e"の "Metadata.json"が必要です。この場合、data.metadataの必須プロパティが "a"、 "b"、 "c"であることを定義/プロパティの内部に示す方法はありますか?この設計は、「更新」操作で必要となる可能性のあるユースケースに従います渡される "metadata.json"

例:。

Data.json

​​

metadata.json

{ 
    "properties":{ 
     "a":{ 

     }, 
     "b":{ 

     }, 
     "d":{ 

     }, 
     "e":{ 

     } 
} 
関連する問題