java 比较两个json对象_比较任意两个JSON串是否相等(比较对象是否相等)JAVA版

废话少说,直接入题。

在面向对象语言中,经常会比较两个对象是否相等,而比较的大多是实体类实例,也就是封装数据的那些类实例,或者是Map、List互相嵌套成的复杂数据结构。

比较对象是否相等,常见的思路是重写equals方法,但鉴于对象的种类多变,嵌套层次复杂,仅仅靠重写equals是很难实现的。

小菜的思路是可以把对象序列化,由于这些对象均是用来表达数据结构,因此可以直接转换成JSON字符串,用字符串来描述数据结构,避免实现Serializable接口。将对象序列化成字符串后,比较是否相等就相对简单了。

小菜提供的正是比较两个JSON串是否相等的方法,并不是说JSON串完全一样才叫相等,对于List(或数组)结构而言,如果仅仅是元素排列顺序不同,也是相等的。

为了保证方法的准确性,请传入标准的JSON串,也就是说key也要加双引号。用过js的童鞋可能会被误导:我在js中写的JSON,key可以不加双引号啊!实际上,你在js中写的是js语言的Object,并不是JSON,只不过它的语法和JSON非常像而已,JSON仅仅是一种字符串规范,而且真正的JSON只有一种,那就是key加了双引号的!

另外,此方法不依赖任何第三方包。

最后声明,由于数据结构复杂,小菜对这个方法不可能进行遍历性测试,所以这个方法的准确性有待考究,请谨慎使用!如有问题,欢迎反馈!

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* 比较两个json串是否相同

* @param j1 第一个json串(json串中不能有换行)

* @param j2 第二个json串(json串中不能有换行)

* @return 布尔型比较结果

*/

public static boolean jsonEquals(String j1,String j2){

//将json中表示list的[]替换成{}。思想:只保留层次结构,不区分类型

//这样直接替换,可能会导致某些value中的符号也被替换,但是不影响结果,因为j1、j2的变化是相对的

j1 = j1.replaceAll("\\[", "{");

j1 = j1.replaceAll("]", "}");

j2 = j2.replaceAll("\\[", "{");

j2 = j2.replaceAll("]", "}");

//将json中,字符串型的value中的{},字符替换掉,防止干扰(并没有去除key中的,因为不可能存在那样的变量名)

//未转义regex:(?<=:")(([^"]*\

你可能感兴趣的:(java,比较两个json对象)