【问题标题】:JSONObject.similar(JSONObject) what does this really compare?JSONObject.similar(JSONObject) 这真的比较什么?
【发布时间】:2017-07-26 22:26:22
【问题描述】:

我一直在寻找一种方法来比较两个 JSONObjects 除了使用

JSONObject.toString().equals(JSONObject.toString())

遇到了这种类似的方法,但它的比较真的很模糊。

“确定两个 JSONObject 是否相似。它们必须包含相同的名称集,这些名称必须与相似值相关联。” Link

这是什么意思?有多相似?完全一样吗?

我搜索得很辛苦,找不到任何可以清除它的东西。

【问题讨论】:

标签: java json


【解决方案1】:

这是sourceJSONObject.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。

【讨论】:

    【解决方案2】:

    您找到的描述与 JSONObject.similar() 方法有关,该方法比较两个 JSON 对象是否相同,但其属性的顺序可能不同。

    equals() 会比较每个字符串的字符,一一检查是否相同,是否具有相同的顺序。

    【讨论】:

    • 这取决于 JSONObject 的实现。请记住,org.json.JSONObject 的 equals 方法没有被覆盖,它只检查引用是否相同。在示例中 new JSONObject("{}").equals(new JSONObject("{}")) 将返回 false(对于 org.json.* 实现)
    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多