2013-10-14 46 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 –