2016-09-05 53 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"] 
    } 
    } 
} 

這個模式表示一個對象有兩個vairable billing_addressshipping_address,兩者都是類型地址,其中包含三個屬性:street_address,city and state

現在,我有另外一個「大」的模式:

{ 
    "$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是免費模式。你將不得不實現你自己的json驗證器。但這不是很好... – dit

回答

3

只是測試它。在我目前的項目中,我正在撰寫以下合同測試:

1)具有Java域對象,我將其序列化爲JSON並將其與參考JSON數據進行比較。我使用https://github.com/skyscreamer/JSONassert來比較兩個JSON字符串。 對於參考JSON數據,您需要使用'小模式'對象。 2)具有示例JSON數據,我將其反序列化到我的域對象,並驗證反序列化是否成功。我將反序列化結果與模型對象進行比較。對於示例JSON數據,您應該使用「較大的模式」對象。 此測試驗證'較大模式'JSON數據是否向後兼容'較小模式'域。

我在我的領域模型的每個級別編寫測試 - 一個用於頂級對象,另一個用於每個非平凡的嵌套對象。這需要更多的測試代碼和更多的JSON樣本數據,但提供了更好的信心。如果失敗了,錯誤信息將會被微調,你將確切地知道層次結構破壞的程度(JSONAssert錯誤信息可能有很多錯誤,並且對於深度嵌套的對象層次結構來說是不重要的)。所以這是一個折衷 *花費的時間之間,以保持測試代碼和數據 *錯誤信息

這種測試是質量快,他們只需要JSON序列化/反序列化。

https://github.com/spring-cloud/spring-cloud-contract將幫助你在寫合同測試的REST API,通訊,etc-但對於簡單案件程序上面給出的可能是我不夠好

相關問題