2017-04-12 15 views
1

以下の例では、 "Vendor"は必須であり、ある値(minLength = 1)を持つ必要がありますが、Mode = Groundの場合、常に空白として返されます。 jsonレスポンスの下。 JSONレスポンスは以下のようになります。条件付きJsonスキーマ - レスポンス依存

{ 
    "Res": { 
    "Mem": [ 
     { 
     "Mode": "Flight", 
     "Vendor": "YP", 
     "MemNum": "222" 
     }, 
     { 
     "Mode": "Ground", 
     "Vendor": "", 
     "MemNum": "242" 
     } 
    ] 
    } 
} 

JSONレスポンスでは、「モード」の両方が常に返されます。 私が指定できるカスタマイズされたスキーマを作成できますか? "Mode" = "Ground"の場合、スキーマ1で検証します。 他のすべての "モード"は検証のためにschema2から参照を取得します。

私は以下を試みたが望ましい結果を得ることができている:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": [ 
    "Res" 
    ], 
    "properties": { 
    "Res": { 
     "type": "object", 
     "required": [ 
     "Mem" 
     ], 
     "properties": { 
     "Mem": { 
      "type": "array", 
      "allOf": [ 
      { 
       "$ref": "#/definitions/Flight" 
      }, 
      { 
       "$ref": "#/definitions/Ground" 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "definitions": { 
    "Flight": { 
     "properties": { 
     "Mode": { 
      "enum": [ 
      "Flight" 
      ] 
     }, 
     "VendorCode": { 
      "type": "string", 
      "minLength": 1, 
      "optional": false 
     }, 
     "MemNum": { 
      "type": "string", 
      "minLength": 1, 
      "optional": false 
     } 
     } 
    }, 
    "Ground": { 
     "properties": { 
     "Mode": { 
      "enum": [ 
      "Ground" 
      ] 
     }, 
     "VendorCode": { 
      "type": "string" 
     }, 
     "MemNum": { 
      "type": "string", 
      "minLength": 1, 
      "optional": false 
     } 
     } 
    } 
    } 
} 

は、所望の結果を達成するために役立つことができJSONスキーマ内の他の概念はありますか?

+0

コードを正しくフォーマットしてください。質問のフォーマットが間違っていると、あなたの質問が重要ではないというメッセージが送信され、潜在的な回答者に障壁がもたらされます。 –

+0

トムありがとう、私は書式を修正しました! – GuruAPI

答えて

0

これはかなり厄介なユースケースですが、"allOf""anyOf""not"と一緒にそれをハックすることができます。

はスキーマ:

{ 
    "oneOf" : [ 
     { 
      "allOf" : [ 
       { 
        "$ref" : "#/definitions/ModeIsGround" 
       }, 
       { 
        // schema1 comes here 
       } 
      ] 
     }, 
     { 
      "allOf" : [ 
       { 
        "not" : { 
         "$ref" : "#/definitions/ModeIsGround" 
        } 
       }, 
       { 
        // schema2 comes here 
       } 
      ] 
     } 
    ], 
    "definitions" : { 
     "ModeIsGround" : { 
      "properties" : { 
       "Mode" : { 
        "enum" : ["Ground"] 
       } 
      } 
     } 
    } 
} 

あなたがSCHEMA1とSCHEMA2であり、また、お使いの貼り付けスキーマが不正な形式が何であるかをあなたの質問では教えてくれなかったので、私は単純にSCHEMA1とSCHEMA2としてこれらを参照してください、コメントしました。

説明:トップレベルではサブジェクトがサブスキーマの1つに一致する必要があります。最初のサブスキーマは、サブジェクトが "ModeIsGround"とschema1に一致する必要があると述べています(これは、 "モード" = "グラウンド"のとき、schema1で検証した場合のようです)。 2番目のサブスキーマは、サブジェクトが "ModeIsGround"に一致してはならないが、スキーマ2と一致する必要があると述べています(これは "他のすべてのモード"モードです。

"oneOf"と組み合わされたこれら2つのサブスキーマは、あなたが望むことを行います。

"Mode" = "Ground"述部は、単一要素列挙型で表現されます。

私はそれが役に立ちそうです。

関連する問題