如何比较从json填充的2个动态列表?

时间:2015-06-03 13:51:38

标签: c# json

我有一个动态JSON,我使用Newronsoft JSON进行反序列化。

    if (string.IsNullOrEmpty(JsonString) == false)
    {
        DeserializedJson = JsonConvert.DeserializeObject<dynamic>(JsonString);
    }

Json是一个数组,其中一个节点就是结果。我有2个列表node1和node2。来自不同来源的2个完全相同的Json stirngs用结果节点中的项填充这些列表。

public List<object> node1;
public List<object> node2
int Node1TotalResults = Enumerable.Count(Searchers[0].DeserializedJson.Results);
int Node2TotalResults = Enumerable.Count(Searchers[1].DeserializedJson.Results);
for (int i = 0; i <= (Node1TotalResults - 1); i++)
{
    node1.Add(Searchers[0].DeserializedJson.Results[i]
}
//Same stuff for node2

现在比较,我尝试了两种不同的方法,但没有一种方法能够发挥作用。但如果我手动打印它们,两个列表看起来都很相似。以下是我对它们的比较:

//1st Method:
  if (node1.SequenceEqual(node2))
  {
      result = true;
  }

//2nd Method:
  if(object.Equals(node1, node2))
  {
            result = true;
  }

这两种方法都返回false。我能在这做什么?

Here is the Sample JSON:
 "Results": [
    {
        "MlsCode": "NON-MLS",
        "MlsAgentId": "45D7D24E253F46A88458B88891E05A1D",
        "UserId": null,
        "FirstName": "Eric",
        "LastName": "Heal",
        "OfficeName": "Nick Salamone Real Estate",
        "MlsOfficeId": "62B8C79E0E0E4D63A7EEF2313BAC98DF",
        "Phones": [
            "3125688028"
        ]
     }
]

我应该补充一点,当我将这个json转换为c#类并将结果数组中的单个键/项添加到这些列表并使用上面的第一种方法进行比较时,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

使用JToken.DeepEquals比较两个JArray s

string jsonString1 = ...;
string jsonString2 = ...;

var obj1 = JObject.Parse(jsonString1);
var obj2 = JObject.Parse(jsonString2);

var areEqual = JToken.DeepEquals(obj1["Results"], obj2["Results"]);

答案 1 :(得分:0)

杰森:

{
    "Results": [
        {
            "MlsCode": "NON-MLS",
            "MlsAgentId": "45D7D24E253F46A88458B88891E05A1D",
            "UserId": null,
            "FirstName": "Eric",
            "LastName": "Heal",
            "OfficeName": "NickSalamoneRealEstate",
            "MlsOfficeId": "62B8C79E0E0E4D63A7EEF2313BAC98DF",
            "Phones": [
                "3125688028"
            ]
        }
    ]
}

会导致(复制+粘贴特殊&gt;粘贴JSON作为类):

    public class Rootobject
    {
        public Result[] Results { get; set; }
    }

    public class Result
    {
        public string MlsCode { get; set; }
        public string MlsAgentId { get; set; }
        public object UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string OfficeName { get; set; }
        public string MlsOfficeId { get; set; }
        public string[] Phones { get; set; }
    }

要反序列化:

public static class Extensions
{
    public  static bool DeserializeJson<T>(this String str, out T item)
    {
        item = default(T);
        try
        {
            item = new JavaScriptSerializer().Deserialize<T>(str);
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

之后你可以写:

var jsonStr = "{\"Results\": [...]}";
Rootobject json;
if(jsonStr.DeserializeJson(out json)){
    //do something with json
}

回答问题。 最简单的方法是检查2个对象的序列化版本