我在使用gson(我的gson版本是2.3.1)时遇到了一个奇怪的问题。
我有一个叫做jsonObject的JsonObject实例(JsonObject jsonObject)。
jsonObject有值,不为空。
然后我创建了另一个JsonObject实例,JsonObject tempOject = jsonObject;。
因此,当我尝试在tempObject中删除元素时,比如说tempObject.remove("children");
那么这段代码会影响到jsonObject实例。
以下是代码片段:
jsonObject = element.getAsJsonObject();
JsonElement tempElement = element;
JsonObject tempObject = jsonObject;
String tempJson;
if(tempObject.has("children")){
tempObject.remove("children");
tempJson = tempObject.toString();
tempElement = new JsonParser().parse(tempJson);
}
if(nodes.isEmpty()){
elements = new ArrayList<>();
nodes.put(iterator, elements);
}
if(!nodes.containsKey(iterator)){
elements = new ArrayList<>();
nodes.put(iterator, elements);
}
nodes.get(iterator).add(tempElement);
if (jsonObject.has("children")){
tempNextJson = jsonObject.get("children").toString();
tempCurrJson = jsonObject.toString();
tempIterator++;
metaDataProcessor(tempNextJson, tempCurrJson, tempNextJson, tempIterator, maxLevel);
}
我已经阅读了gson JsonObject类,它使用深度复制方法。这不应该影响引用,因为JsonObject使用深度值复制,所以返回的JsonObject对象是新的。
但是为什么会发生这种情况呢?
无论如何,在JsonObject类中有deepCopy方法。
JsonObject deepCopy() {
JsonObject result = new JsonObject();
Iterator i$ = this.members.entrySet().iterator();
while(i$.hasNext()) {
Entry entry = (Entry)i$.next();
result.add((String)entry.getKey(), ((JsonElement)entry.getValue()).deepCopy());
}
return result;
}
但是这是JsonElement类中的一个抽象方法,由JsonObject实现。由于该属性未设置为公共属性,因此我无法调用该方法。但我猜测当我执行实例复制时,该方法应该被直接调用。
那怎么样呢?
提前感谢您。
tempObject = jsonObject
,tempObject
保留了相同的对象引用...你需要执行tempObject = jsonObject.clone()
。 - fmodos