Java Gson JsonArray中的NoSuchMethodException

Java Gson JsonArray中的NoSuchMethodException,java,gson,Java,Gson,所以我偶然发现了这个错误,每当我试图从JsonArray对象中删除一个元素时,就会出现NoSuchMethodException。但是在看了整整一天之后,我找不到它的原因。该方法存在于项目中包含的.jar文件中编译的.class文件中。我现在不知所措。当然问题出在椅子和键盘之间,但我看不出来 编辑:编译项目后,我没有发现这个错误,因此这与eclipse如何管理依赖项有关,因为有一个项目确实使用了gson-2.2.4 我正在使用通过maven附带的jar,甚至下载了jar文件本身 引发错误的代码示

所以我偶然发现了这个错误,每当我试图从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(); }