web-dev-qa-db-ja.com

Javaでorg.json.JSONObjectのクローンを作成するにはどうすればよいですか?

org.json.JSONObjectのインスタンスを、文字列化して結果を再解析せずに複製する方法はありますか?

浅いコピーでも問題ありません。

39
Daniel Schaffer

public JSONObject(JSONObject jo, Java.lang.String[] names) コンストラクターと public static Java.lang.String[] getNames(JSONObject jo) メソッドを使用します。

JSONObject copy = new JSONObject(original, JSONObject.getNames(original));
55
Bill the Lizard

最も簡単な(そして非常に遅く、非効率的な)方法

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

Com.google.gwt.json.client.JSONObjectの既存のディープクローンメソッドは見つかりませんでしたが、実装は次のような数行のコードである必要があります。

public static JSONValue deepClone(JSONValue jsonValue){
    JSONString string = jsonValue.isString();
    if (string != null){return new JSONString(string.stringValue());}

    JSONBoolean aBoolean = jsonValue.isBoolean();
    if (aBoolean != null){return JSONBoolean.getInstance(aBoolean.booleanValue());}

    JSONNull aNull = jsonValue.isNull();
    if (aNull != null){return JSONNull.getInstance();}

    JSONNumber number = jsonValue.isNumber();
    if (number!=null){return new JSONNumber(number.doubleValue());}

    JSONObject jsonObject = jsonValue.isObject();
    if (jsonObject!=null){
        JSONObject clonedObject = new JSONObject();
        for (String key : jsonObject.keySet()){
            clonedObject.put(key, deepClone(jsonObject.get(key)));
        }
        return clonedObject;
    }

    JSONArray array = jsonValue.isArray();
    if (array != null){
        JSONArray clonedArray = new JSONArray();
        for (int i=0 ; i < array.size() ; ++i){
            clonedArray.set(i, deepClone(array.get(i)));
        }
        return clonedArray;
    }

    throw new IllegalStateException();
}

* 注: *まだテストしていません!

2
Uri

原因$JSONObject.getNames(original)はAndroidでアクセスできないため、次の方法で実行できます。

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;
}

ただし、ディープコピーではないことを忘れないでください。

2
Bogdan Stadnyk

Android開発者の場合、.getNamesを使用しない最も簡単なソリューションは次のとおりです。

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

注:これはshallowコピーのみです

0
Gibolt