当前位置: 首页 > 工具软件 > JSON4J > 使用案例 >

json4j equals 使用注意事项

梁丘安晏
2023-12-01

技术实背景:org.apache.wink.json4j 中JSONObject间接继承了AbstractMap类,而AbstractMap重写了equals和hasCode方法,所以我们在做JSONObject进行equals进行比较时,不用再重写equals

1,问题,突然有一次,我如何调试也无法通过equals来判断出两个参数值一样的json对象是相等的结果,

拿如下代码做为示例:

	public static void main(String[] args) throws JSONException {
		long currentTime = Calendar.getInstance().getTimeInMillis();
		JSONObject json1 = new JSONObject();
		json1.put("test1", "value1");
		json1.put("test2", "value2");
		json1.put("time", currentTime);
		
		JSONObject json2 = new JSONObject();
		json2.put("test1", "value1");
		json2.put("test2", "value2");
		json2.put("time", json1.getString("time"));
		
		boolean res = json1.equals(json2);
		System.out.println(res); // here output false
	}

原配预期这个结果会是true,结果输出了false

经过调试发现,问题出现在了time这个字段上,如果去掉time,那么输出的结果才为true。

经过跟踪调试,最终突然惊觉,原来是因为json1.getString("time")得到的是字符串,所以json1的time对应的整型值与json2的time对就的字符串值进行对比,即使转换成同一类型后的值是一样的,但是在这里因为是不同的类型的对比,所以最终返回false了.

2, 解决:将json2对应的time值,转换为Long类型, 与json1的time值的类型保持一致

		long currentTime = Calendar.getInstance().getTimeInMillis();
		JSONObject json1 = new JSONObject();
		json1.put("test1", "value1");
		json1.put("test2", "value2");
		json1.put("time", currentTime);
		
		JSONObject json2 = new JSONObject();
		json2.put("test1", "value1");
		json2.put("test2", "value2");
		json2.put("time", Long.parseLong(json1.getString("time")));
		
		boolean res = json1.equals(json2);
		System.out.println(res); // here output true

总上:当具有相同属性的json进行equals比较时, 一定保证对应的属性值的类型是完成一样的

 类似资料: