Newtonsoft.json: 当数组元素的顺序不同时,DeepEquals 失败

创建于 2017-09-19  ·  3评论  ·  资料来源: JamesNK/Newtonsoft.Json

我正在比较两个解析的字符串,到目前为止,这对我们所有的测试都完美无缺。
但是,我遇到过当数组中对象的顺序不相同时 DeepEquals 失败的情况。
如果我更新一个 Json 以匹配另一个,则测试通过。

// data is a string (a .json file read as text)
JToken expectedJson = JToken.Parse(data).SelectToken(jPath);
// Content is a string (the response body as returned by RestSharp
JToken jsonResponse = JToken.Parse(Content);
return JToken.DeepEquals(expectedJson, jsonResponse);

源/目标 JSON

首先是API返回的JSON:

{
  "isHohrResponse": true,
  "messages": [],
  "success": true,
  "data": {
    "totalPaid": 301,
    "requiresConfirmation": false,
    "jobs": [
      {
        "jobId": "600dea62-f084-4459-9e91-8e809884d130",
        "jobName": "Job I",
        "fee": 76,
        "totalPayed": 76,
        "paymentUserInfo": [
          {
            "id": "ab2b408d-1e44-408e-b8e4-df779e31e37d",
            "name": "Frederik25 D",
            "isStarted": true,
            "hasLiked": true
          }
        ],
        "requiresConfirmation": false
      },
      {
        "jobId": "ca0a14b4-0206-45ba-9c31-cd5fa7745058",
        "jobName": "Job H",
        "fee": 75,
        "totalPayed": 225,
        "paymentUserInfo": [
          {
            "id": "3a1a91cf-03f9-4f06-9679-c339ddc295d7",
            "name": "Frederik23 D",
            "isStarted": true,
            "hasLiked": true
          },
          {
            "id": "9e323b98-08dc-4bc0-854e-f42711258252",
            "name": "Frederik26 D",
            "isStarted": true,
            "hasLiked": true
          },
          {
            "id": "68ab2e64-6356-4263-a8cb-2953deb675b6",
            "name": "Frederik24 D",
            "isStarted": true,
            "hasLiked": true
          }
        ],
        "requiresConfirmation": false
      }
    ]
  }
}

现在,JSON 以不同的顺序具有最终的 paymentUserInfo 对象:

{
  "isHohrResponse": true,
  "messages": [],
  "success": true,
  "data": {
    "totalPaid": 301,
    "requiresConfirmation": false,
    "jobs": [
      {
        "jobId": "600dea62-f084-4459-9e91-8e809884d130",
        "jobName": "Job I",
        "fee": 76,
        "totalPayed": 76,
        "paymentUserInfo": [
          {
            "id": "ab2b408d-1e44-408e-b8e4-df779e31e37d",
            "name": "Frederik25 D",
            "isStarted": true,
            "hasLiked": true
          }
        ],
        "requiresConfirmation": false
      },
      {
        "jobId": "ca0a14b4-0206-45ba-9c31-cd5fa7745058",
        "jobName": "Job H",
        "fee": 75,
        "totalPayed": 225,
        "paymentUserInfo": [
          {
            "id": "68ab2e64-6356-4263-a8cb-2953deb675b6",
            "name": "Frederik24 D",
            "isStarted": true,
            "hasLiked": true
          },
          {
            "id": "9e323b98-08dc-4bc0-854e-f42711258252",
            "name": "Frederik26 D",
            "isStarted": true,
            "hasLiked": true
          },
          {
            "id": "3a1a91cf-03f9-4f06-9679-c339ddc295d7",
            "name": "Frederik23 D",
            "isStarted": true,
            "hasLiked": true
          }
        ],
        "requiresConfirmation": false
      }
    ]
  }
}

最有用的评论

制作了一个自定义差异检查器,一旦 DeepEquals 失败就会触发。 奇迹般有效。 能够忽略数组顺序(DeepEquals 的布尔参数?)

所有3条评论

我也遇到过同样的问题。 这是一个复制它的链接。 https://dotnetfiddle.net/SEMSJZ

我现在找到了一个解决方法:) 但它确实涉及创建一个类来反序列化json

var expectedJson = JsonConvert.SerializeObject(JsonConvert.DeserializeObject<SomeClass>(expected));
var mappedJson = JsonConvert.SerializeObject(JsonConvert.DeserializeObject<SomeClass>(mapped));
Assert.True(JToken.DeepEquals(expectedJson, mappedJson));

制作了一个自定义差异检查器,一旦 DeepEquals 失败就会触发。 奇迹般有效。 能够忽略数组顺序(DeepEquals 的布尔参数?)

此页面是否有帮助?
0 / 5 - 0 等级