Java 使用GSON从JSON转换,无法将ArrayList强制转换为对象
我试图通过将ArrayList转换为JSON来使用SharedReferences保存数据。每当我试图检索数据并将其转换回时,就会出现无法将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
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播放歌曲;
)我甚至没有注意到我扩展了播放列表类。谢谢,它起作用了!很高兴我能帮忙!我甚至没有注意到我扩展了播放列表类。谢谢,它起作用了!很高兴我能帮忙!