【发布时间】:2017-07-26 22:26:22
【问题描述】:
我一直在寻找一种方法来比较两个 JSONObjects 除了使用
JSONObject.toString().equals(JSONObject.toString())
遇到了这种类似的方法,但它的比较真的很模糊。
“确定两个 JSONObject 是否相似。它们必须包含相同的名称集,这些名称必须与相似值相关联。” Link
这是什么意思?有多相似?完全一样吗?
我搜索得很辛苦,找不到任何可以清除它的东西。
【问题讨论】:
我一直在寻找一种方法来比较两个 JSONObjects 除了使用
JSONObject.toString().equals(JSONObject.toString())
遇到了这种类似的方法,但它的比较真的很模糊。
“确定两个 JSONObject 是否相似。它们必须包含相同的名称集,这些名称必须与相似值相关联。” Link
这是什么意思?有多相似?完全一样吗?
我搜索得很辛苦,找不到任何可以清除它的东西。
【问题讨论】:
这是source 的JSONObject.similar():
/**
* Determine if two JSONObjects are similar.
* They must contain the same set of names which must be associated with
* similar values.
*
* @param other The other JSONObject
* @return true if they are equal
*/
public boolean similar(Object other) {
try {
if (!(other instanceof JSONObject)) {
return false;
}
Set<String> set = this.keySet();
if (!set.equals(((JSONObject)other).keySet())) {
return false;
}
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
Object valueThis = this.get(name);
Object valueOther = ((JSONObject)other).get(name);
if (valueThis instanceof JSONObject) {
if (!((JSONObject)valueThis).similar(valueOther)) {
return false;
}
} else if (valueThis instanceof JSONArray) {
if (!((JSONArray)valueThis).similar(valueOther)) {
return false;
}
} else if (!valueThis.equals(valueOther)) {
return false;
}
}
return true;
} catch (Throwable exception) {
return false;
}
}
本质上similar() 递归比较 JSONObjects 的名称和值,如果它们相同则返回 true。
首先,它检查键集是否相等,然后转到值。
它递归地检查键集中的每个值,以查看它们在每个 JSONObject 中是否相等。如果不是,则返回 false。
【讨论】:
您找到的描述与 JSONObject.similar() 方法有关,该方法比较两个 JSON 对象是否相同,但其属性的顺序可能不同。
equals() 会比较每个字符串的字符,一一检查是否相同,是否具有相同的顺序。
【讨论】: