org.json.JSONObject
のインスタンスを、文字列化して結果を再解析せずに複製する方法はありますか?
浅いコピーでも問題ありません。
public JSONObject(JSONObject jo, Java.lang.String[] names)
コンストラクターと public static Java.lang.String[] getNames(JSONObject jo)
メソッドを使用します。
JSONObject copy = new JSONObject(original, JSONObject.getNames(original));
最も簡単な(そして非常に遅く、非効率的な)方法
JSONObject clone = new JSONObject(original.toString());
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();
}
* 注: *まだテストしていません!
原因$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;
}
ただし、ディープコピーではないことを忘れないでください。
Android開発者の場合、.getNames
を使用しない最も簡単なソリューションは次のとおりです。
JSONObject copy = new JSONObject();
for (Object key : original.keySet()) {
Object value = original.get(key);
copy.put(key, value);
}
注:これはshallowコピーのみです