技术实背景: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比较时, 一定保证对应的属性值的类型是完成一样的