2015-01-03 62 views
3

我想將對象列表存儲到SharedPreferences,所以我使用Gson將對象列表轉換爲JSON並再次返回。然而,當我保存然後檢索對象的列表和ListView的接頭被用於新的列表中,我得到以下錯誤:安卓JSON解析與GSON崩潰:LinkedTreeMap不能轉換爲對象

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to appuccino.simplyscan.Objects.Folder 
      at appuccino.simplyscan.Extra.DocumentAdapter.getView(DocumentAdapter.java:117) 

,其中在這條線在列表中的適配器的錯誤點:

Folder folder = folderList.get(position); 

當存儲對象列表,我使用了以下內容:

//folderList is a List<Folder> folderList = new ArrayList<>(); 
folderList.add(0, newFolder); 
Gson gson = new Gson(); 
String newFoldersJson = gson.toJson(folderList); 
PrefManager.putString(PrefManager.FOLDER_JSON, newFoldersJson); 

在最後一行只存儲串入SharedPreferences。當檢索從SharedPreferences列表中,我使用了以下內容:

public static List<Folder> loadFolders(MainActivity main){ 
     //JSON containing a list of folder objects 
     String foldersJSON = PrefManager.getString(PrefManager.FOLDER_JSON, ""); 
     if(!foldersJSON.isEmpty()){ 
      Gson gson = new Gson(); 
      List<Folder> folderList = gson.fromJson(foldersJSON, List.class); 
      return folderList; 
     } 

     return new ArrayList<>(); 
    } 

如果有幫助,這是我的文件夾類是如何定義的:

public class Folder { 
    private String name; 
    private List<String> docNameList; 
    private transient List<Document> docList; 

    public Folder(String n) { 
     name = n; 
     docList = new ArrayList<>(); 
     docNameList = new ArrayList<>(); 
    } 

} 
+0

誤差清楚地示出它在'DocumentAdapter'類的'getView(...)'方法時發生(特別是117行)。那麼爲什麼你沒有發佈該方法的完整代碼呢? – Squonk

+0

可能需要用於Folder的空構造函數。請參閱:http://stackoverflow.com/a/4318722/2832027 – TTransmit

+0

我現在有類似的問題,我相信問題是,當你使用Gson將Json轉換爲Object.class時,像這個'new Gson()。 fromJson(jsonstring,Object.class)'它不會創建一個java.lang.Object,而是一個com.google.gson.internal.LinkedTreeMap。您可能序列化該LinkedTreeMap認爲它是一個Java對象,然後在反序列化期間失敗。 [我現在會進一步調查,如果您在此期間找到了解決方案,請告訴我。] –

回答

-3

不是回答你的問題,而是一個建議。我最近也試圖在Android中使用json,並研究了使用jackson或gson的哪一個。似乎傑克遜有兩個優點:

  1. 傑克遜的表現比gson好。
  2. 如果你在服務器端使用相同的方法,那麼你會得到一致性。

價: [待懶惰生產-機器人] [1] http://java.dzone.com/articles/be-lazy-productive-android