2013-10-14 5 views
1

Bonjour à tous. J'ai un service qui me renvoie une réponse JSON (quelque chose comme ci-dessous):En comparant la réponse JSON de

{ 
    "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" 
     } 
    ] 
    } 
} 

La structure ci-dessus varie en fonction de l'entrée je passe au service. Donc, je ne peux pas construire une classe pour désérialiser la réponse. J'ai besoin de comparer (attribut-attribut comparaison) cette réponse à une réponse que j'ai déjà avec moi (dans un endroit différent).

J'ai essayé de le faire avec la classe dynamique en C# mais pas de chance jusqu'à maintenant. Quelqu'un pourrait-il partager une meilleure approche de travail? Je vous remercie.

+0

avez-vous essayé une bibliothèque JSON qui vous donne objets génériques? –

+0

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

+0

Comment comparer ces deux objets de manière récursive? JObject jo2 = (JObject) JsonConvert.DeserializeObject (resultstr); JObject jo3 = (JObject) JsonConvert.DeserializeObject (expectedstr); – user2879928

Répondre

-1

Si vous utilisez cette réponse JSON une fois, vous pouvez utiliser un JSON dynamique types NET.

Mais si vous utilisez cette réponse de structure JSON à quelques reprises, il est préférable de faire cette réponse à aC# classes (objets), vous aurez donc un accès très facile à ses propriétés, vous avez juste vos objets C# et ils ont des propriétés et vous pouvez simplement vous approcher de chaque domaine que vous souhaitez (avec intellisense). En passant, il est très facile de copier une réponse JSON à une classe C# (quelque chose comme copier coller). Voici comment faire: 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

Utilisez ceci:

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

Pas une solution complète: au lieu de comparer les objets je voudrais simplement les sérialiser à nouveau et comparer les résultats. De cette façon, vous comparez les chaînes JSON qui ont été générées de la même manière - presque comme une forme "canonique". Cependant, ceci suppose que les propriétés apparaissent dans le même ordre (sinon vous aurez des faux négatifs). –

1

Vous pouvez utiliser JToken.DeepEquals comme ceci:

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

La même chose a suggéré ici http://stackoverflow.com/questions/6815006/compare-two-jobjects-or-jarray –