如何在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; }