【问题标题】:Comparing JSON response of比较 JSON 响应
【发布时间】:2013-10-14 18:39:12
【问题描述】:

大家早上好。我有一个服务会返回一个 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# 中的动态类来实现,但到目前为止还没有运气。有人可以分享更好的工作方法吗?谢谢。

【问题讨论】:

标签: c# json dynamic compare


【解决方案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 
}

【讨论】:

【解决方案2】:

试试 Json.Net。它支持动态结构。 这是一个教程: http://www.codeproject.com/Tips/631586/Dynamic-types-with-JSON-NET

【讨论】:

  • 如何递归比较这两个对象? JObject jo2 = (JObject)JsonConvert.DeserializeObject(resultstr); JObject jo3 = (JObject)JsonConvert.DeserializeObject(expectedstr);
【解决方案3】:

使用这个:

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;
}

【讨论】:

  • 不是一个完整的解决方案:我不会比较对象,而是简单地再次序列化它们并比较结果。通过这种方式,您可以比较以相同方式生成的 JSON 字符串 - 几乎就像“规范”形式。但是,这假设属性以相同的顺序出现(否则您将有误报)。
【解决方案4】:

如果您使用这种 JSON 响应一次,那么您可以使用动态 JSON NET 类型。

但是,如果您有时使用此 JSON 结构响应,那么最好对 c# 类(对象)进行此响应,这样您就可以非常轻松地访问它的属性,您只需拥有您的 c# 对象和它们具有属性,您可以简单地接近您希望的每个字段(使用智能感知)。顺便说一句,很容易将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多