2014-11-03 86 views
1

所以我偶然發現了這個錯誤,每當我嘗試從JsonArray對象中移除一個元素時,我都會得到NoSuchMethodException。但看了一整天之後,我找不到原因。該方法存在於包含在我的項目中的.jar文件中的已編譯的.class文件中。而我現在處於虧損狀態。當然問題是在椅子和鍵盤之間,但我只是沒有看到它Gson中的NoSuchMethodException JsonArray

編輯:在編譯項目後,我沒有得到這個錯誤,所以這必須做一些與日食如何管理依賴關係,因爲一個項目使用gson-2.2.4

我正在使用gson 2.3我通過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; 
     } 
    } 
} 

當我編譯使用maven我可以看到,行家我的項目使用GSON 2.3

[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

從罐的javap ~/Downloads/gson-2.3/com/google/gson/JsonArray.class輸出文件是在我的Java項目的類路徑

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(); 
}
+0

堆棧跟蹤如何? – RealSkeptic 2014-11-03 22:11:11

+0

'線程中的異常「main」java.lang.NoSuchMethodError:com.google.gson.JsonArray.remove(I)Lcom/google/gson/JsonElement;'這是整個堆棧跟蹤,那麼我的java文件就在我的項目和沒有其他跡象 – Gabriel 2014-11-03 22:15:04

+0

你使用哪個ide?如果你正在使用Eclipse,你可以打開「打開類型」對話框(在mac:cmd + shift + t,windows:ctrl + shift + t)並寫入com.google.gson.JsonArray然後看到jar/jar嗎? – Devrim 2014-11-03 23:13:29

回答

0

你正在嘗試修改你正在迭代的集合。

除了避免濫用調用toThis和toThat,你應該迭代集合並在必要時插入一個結果,然後分配整個事情。刪除前一個元素後,其中一個元素爲空。

+0

問題是我想不到的一個更好的方式迭代一個非常複雜的JSON與多個嵌套的JSON /數組對象和鍵被用作內容的描述符,我需要創建一個樹出這個JSON :( – Gabriel 2014-11-03 22:10:34

+0

或者有沒有一種方法來迭代每一個JsonElement都像一棵樹? – Gabriel 2014-11-03 22:19:28

+0

就這樣,錯誤發生在沒有迭代的部分代碼中 – RealSkeptic 2014-11-03 22:24:06

3

您的構建設置有問題。

JsonArray.remove(int)在Gson的2.3版中引入。最可能發生的是你正在編譯的版本與正確的版本(2.3)相同,但是在APK中打包的版本不是正確的版本。

+0

我將不得不檢查我的打包jar中的JsonArray.class文件,但我不知道這是怎麼發生的,因爲從開發開始就使用了gson-2.3,並沒有改變。 – Gabriel 2014-11-03 22:46:33

+0

檢查您的導入語句和/或您使用的任何其他庫。通常,第三方庫也會將Gson和他們的庫捆綁在一起,並將其可訪問性公開。您可能會意外地以這種方式導入Gson的替代實現。 – 2014-11-03 22:48:45

+0

它將與eclipse有關,它可能會混淆兩個版本的gson,因爲項目的maven版本沒有這個錯誤 – Gabriel 2014-11-04 08:25:17