在Android上克隆JSONObject的好方法

5

我需要在安卓上克隆一个JSONObject。我知道有一种简单的方法:

JSONObject clone = new JSONObject(original.toString());

但以某种方式,用这种方法感觉不对/很慢。我找到了这个:https://dev59.com/ZWcs5IYBdhLWcg3wfEDa#12809884 ,但在Android上我没有JSONObject.getNames - 有人有关于如何做到这一点的好建议吗?


你有一个names方法,它返回一个名字的JSONArray。我同意,这有点额外负担,但应该能用。 - Blackbelt
@KanakSony 没有问题。这个字符串只是被解析了。 - Blackbelt
@blackbelt,那么它如何变得更慢或错误的方式,因为只有String被克隆从旧引用到新对象,例如new JSONObject(new String(String))? - Kanak Sony
@KanakSony,如果您查看源代码,那就很简单了。例如,在这里:http://grepcode.com/file/repo1.maven.org/maven2/org.json/json/20080701/org/json/JSONObject.java#JSONObject.%3Cinit%3E%28java.lang.String%29 - Blackbelt
https://dev59.com/eHNA5IYBdhLWcg3wrf43 - Zasz
显示剩余2条评论
3个回答

2
我找到的最快且最简单的方法是这个。它可以进行深度复制。
JSONObject clone= new JSONObject(original.toMap());

更新: 根据马科斯的评论,Android中没有可用的toMap()函数。但是,在Maven上可以使用groupId org.json的org.json库: https://search.maven.org/artifact/org.json/json/20210307/bundle

0

你的解决方案效率低下,需要对对象进行序列化,然后重新解析字符串。

最简单、最高效的解决方案是:

JSONObject copy = new JSONObject();
for (Object key : original.keySet()) {
  Object value = original.get(key);
  copy.put(key, value);
}

注意:这只是一个浅拷贝

此外,这只是一个浅拷贝,仅针对上层键。如果存在一些嵌套的JSON对象,它们仍将保持附加状态。 - Andrei K.
浅复制已经指明只有顶层会被复制。 - Gibolt
不确定它的含义:[1](https://en.wiktionary.org/wiki/shallow_copy),[2](https://developer.mozilla.org/en-US/docs/Glossary/Shallow_copy) - Andrei K.
更新:是的,@Gibolt,我认为你是正确的。我的误解在于,在浅拷贝中,我们替换所有引用(甚至嵌套的引用),但保持最终(叶子)值不变。但实际上,它只是创建一个新对象,其底层具有完全相同的数据结构。我的第一条评论很令人困惑,希望将其删除。 - Andrei K.

0

你可以用以下方式实现:

public JSONObject shallowCopy(JSONObject original) {
    JSONObject copy = new JSONObject();

    for ( Iterator<String> iterator = original.keys(); iterator.hasNext(); ) {
        String      key     = iterator.next();
        JSONObject  value   = original.optJSONObject(key);

        try {
            copy.put(key, value);
        } catch ( JSONException e ) {
            //TODO process exception
        }
    }

    return copy;
}

但请记住,这不是深拷贝。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接