2016-04-18 10 views
0

RESTfulなWebサービスのためにスキーマを用意しています。私は、次のスキーマを持っている場合を想像:ペイロードのJSONスキーマが受け入れられたオブジェクトと返されたオブジェクト

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["name"], 
    "properties": { 
    "name": { 
     "type": "string" 
    }, 
    "urn": { 
     "type": "string" 
    } 
    } 
} 

URNが私のサービスによって生成されているので、私はクライアントの要求にそれを受け入れることを望んでいません。したがってurnrequiredアレイに含まれていません。しかし、レスポンスでは必須なので、このスキーマを使用して私のサービスが提供するレスポンスを検証することはできません。私は2つの異なるスキーマを使用する必要がなく、それらを同期させておく必要があります。

両方のケースを厳密にモデル化するために単一のスキーマを使用する方法はありますか?または、2つのスキーマを使用する必要がある場合は、共通のスキーマを参照して、要求と応答スキーマのrequiredフィールドをオーバーライドする方法がありますか? http://json-schema.org/example2.html

も、このディスカッションスレッド:

答えて

2

これは、既知の問題であり、それを処理する良い方法はありません。

これを1つのスキーマに保持する唯一の方法は、requiredアレイにサーバー生成プロパティを含めずに、サーバー側でこれらのプロパティを検証する追加のチェックを行うことです。

いいえ、スキーマキーワードを上書きする方法はありません。 JSONスキーマのキーワードは、常にセットに制約を追加します。あなたは共通のスキーマから始め、そこからallOfを使って拡張する必要があります。

ここでは、行う必要のある種類の例を示します。

作成スキーマ:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "http://example.com/create-my-schema", 
    "type": "object", 
    "required": ["name"] 
    "properties": { 
    "name": { 
     "type": "string" 
    } 
    } 
} 

完全なスキーマ:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "http://example.com/my-schema", 
    "allOf": [{ "$ref": "http://example.com/create-my-schema" }], 
    "required": ["urn"], 
    "properties": { 
    "urn": { 
     "type": "string" 
    } 
    } 
} 

あなたは、スキーマの可読性を気にしない場合は、このアプローチは罰金です。それ以外の場合は、サーバー側でスキーマを動的に作成することを選択した人がいるため、結果のスキーマには重複がありますが、コードには含まれません。

+0

それは理想的ではありませんが、確かにそれで動作すると思います。ありがとう! – Dathan

0

あなたは、いくつかの例については、 "oneOfの"

{ 
    "type" : "object", 
    "required" : ["name"], 
    "properties" : { 
     "name" : { 
      "oneOf" : [{ 
        "$ref" : "#/definitions/withURN" 
       }, { 
        "$ref" : "#/definitions/withoutURN" 
       } 
      ] 
     } 
    }, 
    "definitions" : { 
     "withURN" : { 
      "properties" : { 
       "name" : { 
        "type" : "string" 
       }, 
       "urn" : { 
        "type" : "string" 
       } 
      } 
     }, 
     "withoutURN" : { 
      "properties" : { 
       "name" : { 
        "type" : "string" 
       } 
      } 
     } 
    } 
} 

を使用して動的なスキーマを使用することができますが見てHow to use dependencies in JSON schema (draft-04)

+0

これは、どのコンテキストでも{{"name": "foo"、 "urn": "bar"} 'の両方を検証するように見えます。両方のプロパティを持つスキーマを使用するだけで、すでにそれが実行されます。 2つのスキーマをコピー/ペーストすることなく 'required'フィールドの値だけが異なる2つのスキーマが必要です。 – Dathan

関連する問題