Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JSON解析与GSON崩溃:LinkedTreeMap无法强制转换为对象_Android_Json_Sharedpreferences_Gson - Fatal编程技术网

Android JSON解析与GSON崩溃:LinkedTreeMap无法强制转换为对象

Android JSON解析与GSON崩溃:LinkedTreeMap无法强制转换为对象,android,json,sharedpreferences,gson,Android,Json,Sharedpreferences,Gson,我试图将对象列表存储到SharedReferences中,因此我使用Gson将对象列表转换为JSON并再次转换。但是,当我存储然后检索对象列表,并且ListView的适配器应用于新列表时,我得到以下错误: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to appuccino.simplyscan.Objects.Folder at appuccino

我试图将对象列表存储到SharedReferences中,因此我使用Gson将对象列表转换为JSON并再次转换。但是,当我存储然后检索对象列表,并且ListView的适配器应用于新列表时,我得到以下错误:

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);
 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<>();
    }
//folderList是一个列表folderList=new ArrayList();
添加(0,新文件夹);
Gson Gson=新的Gson();
字符串newFoldersJson=gson.toJson(folderList);
PrefManager.putString(PrefManager.FOLDER_JSON,newFoldersJson);
其中最后一行只是将字符串存储到SharedReferences中。从SharedReferences检索列表时,我使用了以下命令:

//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);
 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<>();
    }
公共静态列表加载文件夹(MainActivity main){
//包含文件夹对象列表的JSON
String foldersJSON=PrefManager.getString(PrefManager.FOLDER_JSON,“”);
如果(!foldersJSON.isEmpty()){
Gson Gson=新的Gson();
List folderList=gson.fromJson(foldersJSON,List.class);
返回文件夹列表;
}
返回新的ArrayList();
}
如果有帮助,下面是如何定义my Folder类:

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

}
公共类文件夹{
私有字符串名称;
私有列表文件名列表;
私人临时名单;
公用文件夹(字符串n){
name=n;
docList=newarraylist();
docNameList=newarraylist();
}
}

不是对你问题的回答,而是一个建议。我最近还尝试在Android中使用json,并研究了很多关于使用jackson或gson的方法。杰克逊似乎有两个优点:

  • 杰克逊的表现比格森好
  • 如果在服务器端使用相同的方法,则可以获得一致性
  • 参考: [懒惰][1]

    该错误清楚地显示它发生在
    DocumentAdapter类的
    getView(…)
    方法中(特别是第117行)。那个么为什么你们还并没有发布该方法的完整代码呢?可能需要一个空的文件夹构造函数。请看:我现在有一个类似的问题,我相信问题在于,当您使用Gson将Json转换为Object.class时,像这样
    new Gson().fromJson(jsonstring,Object.class)
    它不会创建java.lang.Object,而是创建com.google.Gson.internal.LinkedTreeMap。您可能将LinkedTreeMap序列化为Java对象,然后在反序列化过程中失败。[我现在将对此进行进一步调查,如果您在此期间找到了解决方案,请告诉我。]