用C#代码判断json数组是否相等

有这么一个需求,从客户端传入两个或多个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能比较吗?欢迎大家留言讨论或提出异议。