Java 使用GSON从JSON转换,无法将ArrayList强制转换为对象

Java 使用GSON从JSON转换,无法将ArrayList强制转换为对象,java,android,json,gson,Java,Android,Json,Gson,我试图通过将ArrayList转换为JSON来使用SharedReferences保存数据。每当我试图检索数据并将其转换回时,就会出现无法将ArrayList转换为播放列表的错误。你知道这里可能出了什么问题吗 我的播放列表类别: public class Playlist extends ArrayList<Parcelable> implements Parcelable{ private ArrayList<Song> playlistSongs; private S

我试图通过将ArrayList转换为JSON来使用SharedReferences保存数据。每当我试图检索数据并将其转换回时,就会出现无法将ArrayList转换为播放列表的错误。你知道这里可能出了什么问题吗

我的播放列表类别:

public class Playlist extends ArrayList<Parcelable> implements Parcelable{
private ArrayList<Song> playlistSongs;
private String name;

public Playlist(String name) {
    this.name = name;
    this.playlistSongs = new ArrayList<>();
}

protected Playlist(Parcel in) {
    playlistSongs = in.createTypedArrayList(Song.CREATOR);
    name = in.readString();
}

public static final Creator<Playlist> CREATOR = new Creator<Playlist>() {
    @Override
    public Playlist createFromParcel(Parcel in) {
        return new Playlist(in);
    }

    @Override
    public Playlist[] newArray(int size) {
        return new Playlist[size];
    }
};

public ArrayList<Song> getPlaylistSongs() {
    return playlistSongs;
}

public String getName() {
    return name;
}

@Override
public String toString() {
    return name;
}

public int getCount(){
    return playlistSongs.size();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeTypedList(playlistSongs);
    parcel.writeString(name);
}

@Override
public Stream<Parcelable> stream() {
    return null;
}

@Override
public Stream<Parcelable> parallelStream() {
    return null;
}
公共类播放列表扩展ArrayList实现可包裹{
私人ArrayList播放歌曲;
私有字符串名称;
公共播放列表(字符串名称){
this.name=名称;
this.playlistongs=new ArrayList();
}
受保护的播放列表(包裹中){
playlistoks=in.createTypedArrayList(Song.CREATOR);
name=in.readString();
}
公共静态最终创建者=新创建者(){
@凌驾
公共播放列表createFromParcel(包裹中){
返回新的播放列表(在中);
}
@凌驾
公共播放列表[]新阵列(整数大小){
返回新播放列表[大小];
}
};
公共阵列列表GetPlaySongs(){
返回播放歌曲;
}
公共字符串getName(){
返回名称;
}
@凌驾
公共字符串toString(){
返回名称;
}
public int getCount(){
返回播放列表。大小();
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效书面包裹(包裹,内部i){
parcel.writeTypedList(播放歌曲);
包裹。书面记录(姓名);
}
@凌驾
公共流(){
返回null;
}
@凌驾
公共流并行流(){
返回null;
}
}

我在活动中创建所有播放列表后调用的convert to JSON方法:

public boolean writeJSON(ArrayList<Playlist> playlists) {

    SharedPreferences mSettings = getSharedPreferences("Playlists", Context.MODE_PRIVATE);
    SharedPreferences.Editor mEditor = mSettings.edit();

    Type type = new TypeToken<ArrayList<Playlist>>() {
    }.getType();
    try {
        String writeValue = mGson.toJson(playlists, type);
        mEditor.putString("Playlists", writeValue);
        mEditor.commit();
        return true;
    } catch (Exception e) {
        return false;
    }
}
public boolean writeJSON(ArrayList播放列表){
SharedReferences mSettings=GetSharedReferences(“播放列表”,Context.MODE\u PRIVATE);
SharedReferences.Editor mEditor=mSettings.edit();
Type Type=new-TypeToken(){
}.getType();
试一试{
字符串writeValue=mGson.toJson(播放列表,类型);
mEditor.putString(“播放列表”,writeValue);
mEditor.commit();
返回true;
}捕获(例外e){
返回false;
}
}
以及在用户重新启动应用程序后调用的read JSON方法:

    public ArrayList<Playlist> readJSON() {

    SharedPreferences mSettings = getSharedPreferences("Playlists", Context.MODE_PRIVATE);
    Type collectionType = new TypeToken<ArrayList<Playlist>>() {
    }.getType();
    String loadValue = mSettings.getString("Playlists", null);
    ArrayList<Playlist> temp = mGson.fromJson(loadValue, collectionType);
    return temp;
}
public ArrayList readJSON(){
SharedReferences mSettings=GetSharedReferences(“播放列表”,Context.MODE\u PRIVATE);
Type collectionType=new-TypeToken(){
}.getType();
String loadValue=mSettings.getString(“播放列表”,null);
ArrayList temp=mGson.fromJson(loadValue,collectionType);
返回温度;
}

我认为问题在于
播放列表
类扩展了
阵列列表
。GSON正在尝试将您的
播放列表
序列化为
可包裹的列表
。从您的类别来看,它看起来不像是真正需要扩展的
ArrayList
。我试着运行您的示例(为了达到最低限度,我不得不删除很多内容),它将每个
播放列表
序列化为空列表(字符串
“[]”
),而不管
播放歌曲
中有什么内容。我删除了超类,它开始按预期工作。

我认为问题在于
播放列表
类扩展了
数组列表
。GSON正在尝试将您的
播放列表
序列化为
可包裹的列表
。从您的类别来看,它看起来不像是真正需要扩展的
ArrayList
。我试着运行您的示例(为了达到最低限度,我不得不删除很多内容),它将每个
播放列表
序列化为空列表(字符串
“[]”
),而不管
播放歌曲
中有什么内容。我删除了超类,它开始按预期工作。

我认为问题在于此
扩展了ArrayList
。试着使它
扩展ArrayList
,并且您不需要持有ArrayList的引用(
私有ArrayList播放歌曲;

我认为问题在于这
扩展了ArrayList
。尝试使其
扩展ArrayList
,并且您不需要持有ArrayList的引用(
私有ArrayList播放歌曲;

我甚至没有注意到我扩展了播放列表类。谢谢,它起作用了!很高兴我能帮忙!我甚至没有注意到我扩展了播放列表类。谢谢,它起作用了!很高兴我能帮忙!