Ошибка Gson: java.lang.IllegalArgumentException: класс android.app.ExitTransitionCoordinator объявляет несколько полей JSON с именем mHandler

Я пытаюсь преобразовать List пользовательского объекта с именем MyData:

class MyData {
    private String id;
    private String title;
    private Drawable AppIcon;

    public MyData() {}

    public MyData(String id, String title, Drawable _AppIcon) {
        this.id = id;
        this.title = title;
        this.AppIcon = _AppIcon;
    }


    public String getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public Drawable getAppIcon() {
        return this.AppIcon;
    }

}

Я пытаюсь преобразовать его, как я прочитал в документации Gson:

Type listType = new TypeToken<List<MyData>>(){}.getType();
List<MyData> appsList = new ArrayList<>();
String ArrayStr = new Gson().toJson(appsList, listType);

Затем бросается Exception, вот вывод logcat:

java.lang.IllegalArgumentException: class android.app.ExitTransitionCoordinator declares multiple JSON fields named mHandler
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
        at com.google.gson.Gson.getAdapter(Gson.java:423)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164)
        at com.google.gson.internal.bind.ReflectiveType

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

Пожалуйста, опубликуйте образец структуры JSON, который у вас есть. Это поможет выяснить, правильно ли вы построили класс MyData.

Reaz Murshed 01.04.2019 22:27

И более того, я не вижу, чтобы вы что-то помещали в свою переменную appsList, которую нужно преобразовать в строку JSON.

Reaz Murshed 01.04.2019 22:30
1
2
824
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Gson рассматривает Drawable как обычный POJO класс, перебирает все getters и пытается их сериализовать. Похоже, Drawable создает цикл с другими объектами. Вместо того, чтобы хранить весь объект, попробуйте сериализовать только обязательные поля, скопировав их в конструкторе:

public MyData(String id, String title, Drawable appIcon) {
    this.id = id;
    this.title = title;
    this.minWidth = appIcon.getMinimumWidth();
    this.direction = appIcon.getLayoutDirection();
    // copy other fields
}

или напишите собственный сериализатор для класса Drawable:

это была проблема, спасибо!

pr antibit le 02.04.2019 17:42

@prantibitle, я рад это слышать. Также, пожалуйста, взгляните на Как работает принятие ответа?

Michał Ziober 02.04.2019 17:53

Другие вопросы по теме