Ошибка при конвертации JSON в ArrayList

333
21 августа 2017, 08:07

Я пытаюсь передать ArrayList стороннего класса в JSON для сохранения в sharedPreferences, а потом получить его обратно. Конвертация списка в JSON происходит нормально. Но когда я пытаюсь конвертировать строку json в список объектов, я получаю ошибку java.lang.RuntimeException: Failed to invoke public android.graphics.drawable.Drawable() with no args Такая же ошибка возникакает и с другими переменными файла. Как сделать так, чтобы строка JSON нормально конвертировалась в ArrayList?

Получение JSON из SharedPreferences и конвертация в ArrayList

public List<AppDetail> getArrayList() {
    SharedPreferences sharedPreferences = this.getSharedPreferences(ONE_SCREEN_ACTIVITY,Context.MODE_PRIVATE);
    Exclude ex = new Exclude();
    Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
    String json = sharedPreferences.getString(ONE_SCREEN_ACTIVITY, null);
    System.out.println(json);
    Type type = new TypeToken<ArrayList<AppDetail>>() {}.getType();
    ArrayList<AppDetail> gsonList = gson.fromJson(json, type);
    return gsonList; }

Конвертация списка в JSON и запись строки в SharedPreferences

public void saveArrayList(List<AppDetail> list) {
    SharedPreferences sharedPreferences = this.getSharedPreferences(ONE_SCREEN_ACTIVITY,Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Exclude ex = new Exclude();
    Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
    String json = gson.toJson(list);
    editor.putString(ONE_SCREEN_ACTIVITY, json);
    editor.apply();
}

После записи получаю такую строку

{"icon":{},"label":"Chrome","name":"com.android.chrome"},{"icon":{},"label":"Contacts","name":"com.android.contacts"},{"icon":{},"label":"Clock","name":"com.android.deskclock"},{"icon":{},"label":"Messaging","name":"com.android.mms"},{"icon":{},"label":"Settings","name":"com.android.settings"},{"icon":{},"label":"Sound Recorder","name":"com.android.soundrecorder"},{"icon":{},"label":"Play Store","name":"com.android.vending"},{"icon":{},"label":"Drive","name":"com.google.android.apps.docs"},{"icon":{},"label":"Maps","name":"com.google.android.apps.maps"},{"icon":{},"label":"Photos","name":"com.google.android.apps.photos"},{"icon":{},"label":"Android Pay","name":"com.google.android.apps.walletnfcrel"},{"icon":{},"label":"Calendar","name":"com.google.android.calendar"},{"icon":{},"label":"Gmail","name":"com.google.android.gm"},{"icon":{},"label":"Play Music","name":"com.google.android.music"},{"icon":{},"label":"Play Movies \u0026 TV","name":"com.google.android.videos"},{"icon":{},"label":"YouTube","name":"com.google.android.youtube"},{"icon":{},"label":"Phone","name":"com.truecaller"},{"icon":{},"label":"Camera","name":"com.wileyfox.camera"},{"icon":{},"label":"Gallery","name":"org.codeaurora.gallery"},{"icon":{},"label":"Alarm Clock Xtreme","name":"com.alarmclock.xtreme.free"},{"icon":{},"label":"File Manager","name":"com.asus.filemanager"},{"icon":{},"label":"Avito","name":"com.avito.android"},{"icon":{},"label":"Docs","name":"com.google.android.apps.docs.editors.docs"},{"icon":{},"label":"Sheets","name":"com.google.android.apps.docs.editors.sheets"},{"icon":{},"label":"Hangouts","name":"com.google.android.talk"},{"icon":{},"label":"Nova Launcher","name":"com.teslacoilsw.launcher"},{"icon":{},"label":"Uber","name":"com.ubercab"},{"icon":{},"label":"Launcher","name":"mingorto.launcher"},{"icon":{},"label":"2GIS","name":"ru.dublgis.dgismobile"},{"icon":{},"label":"Маркет","name":"ru.yandex.market"},{"icon":{},"label":"Downloads","name":"com.android.documentsui"},{"icon":{},"label":"FM Radio","name":"com.android.fmradio"},{"icon":{},"label":"SIM Toolkit","name":"com.android.stk"},{"icon":{},"label":"Play Books","name":"com.google.android.apps.books"},{"icon":{},"label":"News \u0026 Weather","name":"com.google.android.apps.genie.geniewidget"},{"icon":{},"label":"Duo","name":"com.google.android.apps.tachyon"},{"icon":{},"label":"Wallpapers","name":"com.google.android.apps.wallpaper"},{"icon":{},"label":"Calculator","name":"com.google.android.calculator"},{"icon":{},"label":"Google","name":"com.google.android.googlequicksearchbox"},{"icon":{},"label":"Keep","name":"com.google.android.keep"},{"icon":{},"label":"Screen Recorder","name":"org.cyanogenmod.screencast"},{"icon":{},"label":"Adobe Acrobat","name":"com.adobe.reader"},{"icon":{},"label":"Ringer Modes","name":"com.cgollner.quicktiles"},{"icon":{},"label":"Duolingo","name":"com.duolingo"},{"icon":{},"label":"ES File Explorer","name":"com.estrongs.android.pop"},{"icon":{},"label":"Moon+ Reader","name":"com.flyersoft.moonreader"},{"icon":{},"label":"Total Commander","name":"com.ghisler.android.TotalCommander"},{"icon":{},"label":"Authenticator","name":"com.google.android.apps.authenticator2"},{"icon":{},"label":"Translate","name":"com.google.android.apps.translate"},{"icon":{},"label":"BURGER KING","name":"com.loyaltyplant.partner.burgerkingrussia"},{"icon":{},"label":"Excel","name":"com.microsoft.office.excel"},{"icon":{},"label":"PowerPoint","name":"com.microsoft.office.powerpoint"},{"icon":{},"label":"Word","name":"com.microsoft.office.word"},{"icon":{},"label":"Prisma","name":"com.neuralprisma"},{"icon":{},"label":"Nimses","name":"com.nimses"},{"icon":{},"label":"Opera VPN","name":"com.opera.vpn"},{"icon":{},"label":"Pushbullet","name":"com.pushbullet.android"},{"icon":{},"label":"RAR","name":"com.rarlab.rar"},{"icon":{},"label":"Studify","name":"com.raspisaniyevuzov.app"},{"icon":{},"label":"Skype","name":"com.skype.raider"},{"icon":{},"label":"SoundCloud","name":"com.soundcloud.android"},{"icon":{},"label":"Trello","name"

Класс объекта

public class AppDetail {
   @SerializedName("label")
   public CharSequence label;
   @SerializedName("name")
   public CharSequence name;
   @SerializedName("icon")
   public Drawable icon;
public CharSequence getLabel() {
    return label;
}
public void setLabel(CharSequence label) {
    this.label = label;
}
public CharSequence getName() {
    return name;
}
public void setName(CharSequence name) {
    this.name = name;
}
public Drawable getIcon() {
    return icon;
}
public void setIcon(Drawable icon) {
    this.icon = icon;
}}
READ ALSO
Как обработать пустую ячейку DATETIM

Как обработать пустую ячейку DATETIM

Есть таблица в базе mysql, в которой есть поле DATETIMEЭто поле может быть null

299
Не удается отправить файл на email в андроид

Не удается отправить файл на email в андроид

Приветствую спецов! Я начинающий в программировании на java андроидПытаюсь отправить файл через почтовый клиент

292
Сборка RCP проекта

Сборка RCP проекта

Добрый день! Подскажите пожалуйста как правильно собрать Plug-in проект при помощи Maven? Когда собираю не добавляет папку icons и файл pluginxml в jar

301
Использование библиотеки JSTL

Использование библиотеки JSTL

Я учусь, и мне в моей форме входа и регистрации надо применить jstl библиотекуУ меня простая форма для регистрации и входа, приём данных с которых...

316