2013-10-14 45 views
1

大家早上好。我有返回我的JSON響應(類似下面)一個服務:比較JSON響應的

{ 
    "sessionid": "AQIC5wM2LY4SfcytTIcteNkTtCVrE8A-AS7VR*", 
    "Customers": [ 
    { 
     "id": "4193942846", 
     "firstname": "Anto", 
     "lastname": "Paul", 
     "customertype": "ph", 
     "companyCode": "ABCD", 
    }, 
    { 
     "id": "4193942236", 
     "firstname": "Dimple", 
     "lastname": "Paul", 
     "customertype": "ph", 
     "companyCode": "AB", 
    } 
    ], 
    "Status": "ACTIVE", 
    "serviceStatus": "SUCCESS", 

    "Addresses": { 
    "Address": [ 
     { 
    "type": "M", 
     "addr1": "11011, main st", 
     "addr2": "Apt. 2", 
     "zipcode": "11011" 
     } 
    ] 
    } 
} 

上述結構而變化基於輸入我傳遞給服務。所以,我不能構建一個類來反序列化響應。我需要比較(屬性 - 屬性比較)這個迴應和我已經有的迴應(在不同的地方)。

我試圖用C#中的動態類來實現它,但目前爲止還沒有運氣。有人可以分享一個更好的工作方法嗎?謝謝。

+0

你嘗試任何的JSON庫,讓你通用對象? –

+0

http://james.newtonking.com/json/help/index.html?topic=html/LINQtoJSON.htm –

+0

如何遞歸比較這兩個對象? JObject jo2 =(JObject)JsonConvert.DeserializeObject(resultstr); JObject jo3 =(JObject)JsonConvert.DeserializeObject(expectedstr); – user2879928

回答

-1

如果您正在使用此JSON響應一次,那麼你可以使用動態JSON NET類型。

但是如果你使用這個JSON結構響應了一些時間,那麼最好對ac#類(對象)做出這個響應,這樣你就可以非常容易地訪問它的屬性,你只需要你的c#對象他們有屬性,你可以簡單地接近你想要的每個領域(與intellisense)。順便說一下,將JSON響應複製到C#類(例如複製粘貼)很容易。這裏是如何做到這一點: http://blogs.msdn.com/b/webdev/archive/2012/12/18/paste-json-as-classes-in-asp-net-and-web-tools-2012-2-rc.aspx

0

使用此:

https://jsonutil.codeplex.com/

var obj1 = JSONSerializer.Deserialize(jsontext1); 
var obj2 = JSONSerializer.Deserialize(jsontext2); 

bool Compare(object obj1, object obj2) 
{ 
//if(obj1 is JSONObject && obj2 is JSONObject) 
// => typecase and use jsonObj1.Members to iterate over members and compare values recursively 

//if JSONArray, then iterate over items and compare 

//if anything else... i.e. primitive then compare directly 

//else return false; 
} 
+0

不是一個完整的解決方案:而不是比較對象,我會再次序列化它們並比較結果。通過這種方式,您可以比較已經以相同方式生成的JSON字符串 - 幾乎就像一個「規範」形式。但是,這假定屬性以相同的順序出現(否則將會有錯誤的否定)。 –

1

您可以使用JToken.DeepEquals這樣的:

var response = JObject.Parse(responseJson); 
var goldenStandard = JObject.Parse(goldenStandardJson); 
if (JToken.DeepEquals(response, goldenStandard)) 
{ 
    // the two JSONs have the same data 
} 
+0

這裏提出的同樣的事情http://stackoverflow.com/questions/6815006/compare-two-jobjects-or-jarray –