如何在Java中克隆org.json.JSONObject?
有没有办法克隆org.json.JSONObject
的实例而不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 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; }
但请记住,这不是深层复制。
如果有人来到这里寻找org.google.gson的深层克隆,因为他们没有公开他们的deepClone()方法,这就是我想出来的……
public static JsonElement deepClone(JsonElement el){ if (el.isJsonPrimitive() || el.isJsonNull()) return el; if (el.isJsonArray()) { JsonArray array = new JsonArray(); for(JsonElement arrayEl: el.getAsJsonArray()) array.add(deepClone(arrayEl)); return array; } if(el.isJsonObject()) { JsonObject obj = new JsonObject(); for (Map.Entry entry : el.getAsJsonObject().entrySet()) { obj.add(entry.getKey(), deepClone(entry.getValue())); } return obj; } throw new IllegalArgumentException("JsonElement type " + el.getClass().getName()); }
这里有一些合并两个JsonObject的方法
public static JsonObject merge(String overrideJson, JsonObject defaultObj) { return mergeInto((JsonObject)new JsonParser().parse(overrideJson), defaultObj); } public static JsonObject merge(JsonObject overrideObj, JsonObject defaultObj) { return mergeOverride((JsonObject)deepClone(defaultObj), overrideObj); } public static JsonObject mergeOverride(JsonObject targetObj, JsonObject overrideObj) { for (Map.Entry entry : overrideObj.entrySet()) targetObj.add(entry.getKey(), deepClone(entry.getValue())); return targetObj; } public static JsonObject mergeInto(JsonObject targetObj, JsonObject defaultObj) { for (Map.Entry entry : defaultObj.entrySet()) { if (targetObj.has(entry.getKey()) == false) targetObj.add(entry.getKey(), deepClone(entry.getValue())); } return targetObj; }