2016-09-05 13 views
1

例えば、私はJSONスキーマを持っているが、以下のようになります。JSONスキーマがJavaの別のスキーマと互換性があることを伝える方法は?

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
    "billing_address": { "$ref": "#/definitions/address" }, 
    "shipping_address": { "$ref": "#/definitions/address" } 
    } 

    "definitions": { 
    "address": { 
     "type": "object", 
     "properties": { 
     "street_address": { "type": "string" }, 
     "city":   { "type": "string" }, 
     "state":   { "type": "string" } 
     }, 
     "required": ["street_address", "city", "state"] 
    } 
    } 
} 

このスキーマは、それらの両方は3が含まれているタイプアドレス、である、2 vairable billing_addressshipping_addressを持つオブジェクトを示しますプロパティ:street_address,都市および

は今、私は別の「大きな」スキーマました:あなたが見ることができるように

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
    "billing_address": { "$ref": "#/definitions/address" }, 
    "shipping_address": { "$ref": "#/definitions/address" }, 
    "new_address": { "$ref": "#/definitions/address" } 
    } 

    "definitions": { 
    "address": { 
     "type": "object", 
     "properties": { 
     "street_address": { "type": "string" }, 
     "city":   { "type": "string" }, 
     "state":   { "type": "string" }, 
     "zip_code":  { "type": "string" } 
     }, 
     "required": ["street_address", "city", "state"] 
    } 
    } 
} 

を、私はスキーマに新しいプロパティnew_addressのを追加し、アドレスZIP_CODEと呼ばれる新しいプロパティがありますは必須プロパティではありません)

古いJSONスキーマからオブジェクトを作成した場合、それも新しいJSONスキーマで使用できるようにする必要があります。この場合、新しいスキーマは古いスキーマと互換性があります。 (別の言葉では、新しいスキーマは古いスキーマの拡張ですが、変更はありません)

Javaでスキーマが他のスキーマと互換性があるかどうかを判断するにはどうすればよいですか?複雑なケースも考慮する必要があります(たとえば、数字フィールドの「最小」プロパティ)。

+0

十分に良いかもしれでしょう。独自のjsonバリデーターを実装する必要があります。しかし、これは本当に良いことではありません... – dit

答えて

3

ただテストしてください。私の現在のプロジェクトでは、次のような契約テストを書いています。

1)Javaドメインオブジェクトを持っているので、JSONにシリアル化して参照JSONデータと比較します。 2つのJSON文字列を比較するのにhttps://github.com/skyscreamer/JSONassertを使用します。 JSONデータを参照するには、「より小さなスキーマ」オブジェクトを使用する必要があります。

2)JSONデータのサンプルを持っています。これを自分のドメインオブジェクトにデシリアライズし、デシリアライズが成功したかどうかを確認します。 deserializationの結果をモデルオブジェクトと比較します。 JSONデータのサンプルでは、​​「大きなスキーマ」オブジェクトを使用します。 このテストでは、「より大きなスキーマ」のJSONデータが、あなたの「小さいスキーマ」ドメインと下位互換性があるかどうかを検証します。

これらのテストは、ドメインモデルの各レベルで実行します.1つはトップレベルオブジェクトで、もう1つはそれぞれの重要でないネストされたオブジェクトです。これはより多くのテストコードとより多くのJSONサンプルデータを必要としますが、はるかに優れた信頼性を提供します。何かが失敗した場合、エラーメッセージは微調整され、どのレベルの階層が壊れているか正確に分かります(JSONAssertエラーメッセージには多くのエラーがあり、深くネストされたオブジェクト階層を読むのは簡単です)。だから、テストコードとデータを保持するために *費やした時間の間のトレードオフだ *

このようなテストがあるエラーメッセージの品質急速彼らはJSONのシリアライズ/デシリアライズする必要があります。

https://github.com/spring-cloud/spring-cloud-contractは、あなたがRESTのAPI、メッセージングのための契約のテストを書く助けるetc-単純な例のために、私は上記の手順では、JSONスキーマ無料です

関連する問題