有这么一个需求,从客户端传入两个或多个Json字符串,如果字符串相同只执行一次并返回一个结果,否则返回多个结果。那么问题来了,怎么判断Json字符串是否相等呢?用string.Equal可以判断,如果前端程序员把Json字符串对象的顺序颠倒了呢?转成对象模型判断吗?比如像下面的Json字符串,他们对象其实完全相同,不同的是顺序。那么怎么判断这个json数组是否相等呢?
"[{"id":"1","Name":"刘德华","age":"33"},{"id":"2","Name":"张学友","age":"55"}]";
"[{"id":"1","age":"33","Name":"刘德华"},{"id":"2","age":"55","Name":"张学友"}]";
1、转为对象数组进行比较试一试
我们先转换成对数组对象比较试一试。这里使用的是
string json1 = "[{\"id\":\"1\",\"Name\":\"刘德华\",\"age\":\"33\"},{\"id\":\"2\",\"Name\":\"张学友\",\"age\":\"55\"}]";
string json2 = "[{\"id\":\"1\",\"age\":\"33\",\"Name\":\"刘德华\"},{\"id\":\"2\",\"age\":\"55\",\"Name\":\"张学友\"}]";
var jsondocument1 = JsonSerializer.Deserialize<List<object>>(json1);
var jsondocument2 = JsonSerializer.Deserialize<List<object>>(json2); var JsonDocumentd= jsondocument.Equals(jsondocument2) ;
var IsEqual= Equals(jsondocument1 ,jsondocument2) ;
Console.WriteLine(IsEqual);
Console.ReadLine();
//输出:false
这种方法不能比较,因为引用类型在内存是存储的引用地址,存储在堆上,所以对象的比较不能这么用,通常可以重写Equals方法,在里面具体判断两个对象的各属性是否相等,如果全相等返回true,只要有一项不相等则返回false,如果是数组就更加麻烦了。具体实例这里就不演示了。那么就没法好地比较了吗?有的,下面就介绍。
2、用Newtonsoft的特性比较
其实处理的Json的Newtonsoft包提供了比较方法。首先要在nuget引用Newtonsoft包。代码如下。
string json1 = "[{\"id\":\"1\",\"Name\":\"刘德华\",\"age\":\"33\"},{\"id\":\"2\",\"Name\":\"张学友\",\"age\":\"55\"}]";
string json2 = "[{\"id\":\"1\",\"age\":\"33\",\"Name\":\"刘德华\"},{\"id\":\"2\",\"age\":\"55\",\"Name\":\"张学友\"}]";
var rel1 = JArray.Parse(json1);
var rel2 = JArray.Parse(json2);
var rel3=JArray.DeepEquals(rel1 , rel2);
Console.WriteLine(rel3);
Console.ReadLine();
//输出:true
这里先把json字符串转成Array,然后用JArray.DeepEquals特性对比。输出true,完美解决。
结语
本文讲述了用C#代码判断json数组是否相等的方法,使用对象的比较是行不通的,好在Newtonsoft提供了DeepEquals特性来比较。你有啥方法来比较吗?.NET Core的新特性System.Text.Json能比较吗?欢迎大家留言讨论或提出异议。
技术群:添加小编微信并备注进群
小编微信:mm1552923 公众号:dotNet编程大全