我有一个动态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#类并将结果数组中的单个键/项添加到这些列表并使用上面的第一种方法进行比较时,它可以正常工作。
答案 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个对象的序列化版本。