Java Gson JsonArray中的NoSuchMethodException
所以我偶然发现了这个错误,每当我试图从JsonArray对象中删除一个元素时,就会出现NoSuchMethodException。但是在看了整整一天之后,我找不到它的原因。该方法存在于项目中包含的.jar文件中编译的.class文件中。我现在不知所措。当然问题出在椅子和键盘之间,但我看不出来 编辑:编译项目后,我没有发现这个错误,因此这与eclipse如何管理依赖项有关,因为有一个项目确实使用了gson-2.2.4 我正在使用通过maven附带的jar,甚至下载了jar文件本身 引发错误的代码示例:Java Gson JsonArray中的NoSuchMethodException,java,gson,Java,Gson,所以我偶然发现了这个错误,每当我试图从JsonArray对象中删除一个元素时,就会出现NoSuchMethodException。但是在看了整整一天之后,我找不到它的原因。该方法存在于项目中包含的.jar文件中编译的.class文件中。我现在不知所措。当然问题出在椅子和键盘之间,但我看不出来 编辑:编译项目后,我没有发现这个错误,因此这与eclipse如何管理依赖项有关,因为有一个项目确实使用了gson-2.2.4 我正在使用通过maven附带的jar,甚至下载了jar文件本身 引发错误的代码示
else if (current.isJsonObject() && hasBucket(current)) {
JsonElement buckets = current.getAsJsonObject().get(BUCKETS);
JsonElement next = null;
if (buckets.isJsonArray() && buckets.getAsJsonArray().size()>0) {
JsonArray arr = buckets.getAsJsonArray();
arr.remove(0); //<--- exception is thrown here
} else if (buckets.isJsonObject()) {
Set<Entry<String,JsonElement>> entrySet = buckets.getAsJsonObject().entrySet();
for (Entry<String, JsonElement> entry : entrySet) {
next = entry.getValue();
buckets.getAsJsonObject().remove(entry.getKey());
break;
}
}
}
您正在尝试修改正在迭代的集合
除了避免滥用调用toThis和toThat之外,还应该迭代集合,必要时插入结果集合,然后分配整个集合。删除前一个元素后,其中一个元素将变为null。生成设置有问题
在Gson的2.3版中引入。最有可能发生的情况是,您正在根据正确的版本(2.3)进行编译,但APK中打包的版本不是正确的版本。问题是,我想不出更好的方法来迭代具有多个嵌套json/数组对象的非常复杂的json,并且密钥被用作内容描述符,我需要用这个json创建一个树:(或者有没有一种方法可以像树一样迭代每个JsonElement?尽管如此,错误发生在代码中没有迭代的部分。我仍然相信他正在删除一个项目,而下一个项目是空节点。你应该获得列表,创建另一个列表,而不是从第一个项目中删除对象,将有效的添加到n中ew one。然后,刷新或擦除原始列表并插入您想要保留的结果。或者,正如我所看到的,没有删除的条件,所以只需运行列表,在循环之后,擦除列表,但不要删除元素,因为迭代器由您正在运行的列表备份。堆栈跟踪如何?
线程“main”中的异常java.lang.NoSuchMethodError:com.google.gson.JsonArray.remove(I)Lcom/google/gson/JsonElement;
这是整个stacktrace,那么在我的项目中只有java文件,没有其他指示您使用哪个ide?如果您正在使用Eclipse,能否打开“打开类型”对话框(在mac:cmd+shift+t,windows:ctrl+shift+t上)然后编写com.google.gson.JsonArray,然后查看jar/jars?我使用eclipse。如果我cmd+单击remove函数,它会将我带到gson-2.3.jar,当我尝试通过cmd+shift+t查找它时,我可以看到包含的2.3版本的gsoni将不得不检查我打包的jar中的JsonArray.class文件,但我想知道这是怎么发生的,因为gson-2.3自开发开始以来一直在使用,尚未更改。请检查您的导入语句和/或您使用的任何其他库。通常情况下,第三方库也会将Gson与其库捆绑在一起,并将其可访问性保留为公共。您可能会意外地以这种方式导入Gson的替代实现。必须这样做对于eclipse,可能会混淆gson的两个版本,因为项目的maven构建没有这个错误
[INFO] Expanding: /Users/####/.m2/repository/com/google/code/gson/gson/2.3/gson-2.3.jar into /Users/####/Documents/workspace/proj_name/target/assembly/work/gson-2.3.jar
Compiled from "JsonArray.java"
public final class com.google.gson.JsonArray extends com.google.gson.JsonElement implements java.lang.Iterable {
public com.google.gson.JsonArray();
com.google.gson.JsonArray deepCopy();
public void add(com.google.gson.JsonElement);
public void addAll(com.google.gson.JsonArray);
public com.google.gson.JsonElement set(int, com.google.gson.JsonElement);
public boolean remove(com.google.gson.JsonElement);
public com.google.gson.JsonElement remove(int); <---- It exists!
public boolean contains(com.google.gson.JsonElement);
public int size();
public java.util.Iterator iterator();
public com.google.gson.JsonElement get(int);
public java.lang.Number getAsNumber();
public java.lang.String getAsString();
public double getAsDouble();
public java.math.BigDecimal getAsBigDecimal();
public java.math.BigInteger getAsBigInteger();
public float getAsFloat();
public long getAsLong();
public int getAsInt();
public byte getAsByte();
public char getAsCharacter();
public short getAsShort();
public boolean getAsBoolean();
public boolean equals(java.lang.Object);
public int hashCode();
com.google.gson.JsonElement deepCopy();
}