JSON Преобразование GSON из String не работает с использованием вложенных объектов и массивов - PullRequest
0 голосов
/ 26 мая 2020

Так что уже давно сижу на этом. Я пытаюсь преобразовать эту JSON String в объект проекта. (Класс Projekt, как показано ниже)

String projectEmptyString = "{\"id\":1,\"name\":\"Seminararbeit Geschichte\",\"description\":\"Der Wilde Westen\",\"comments\":[],\"appointments\":[{\"id\":1,\"name\":\"AppointmentSample\",\"description\":\"AppointmentSample\",\"startDate\":{\"day\":1,\"month\":2,\"year\":2020,\"hour\":4,\"minute\":5},\"endDate\":{\"day\":5,\"hour\":2,\"minute\":1,\"month\":4,\"year\":3},\"type\":\"DEADLINE\"}],\"handlers\":[],\"processors\":[],\"type\":\"SEMINARARBEIT\"}";

Не работает. Я уже пришел к выводу, что если я установлю массив встреч пустым, например:

\"appointments\":[]

, преобразование работает. Так что должна быть ошибка десериализации в объект назначения .

\"appointments\":[{\"id\":1,\"name\":\"AppointmentSample\",\"description\":\"AppointmentSample\",\"startDate\":{\"day\":1,\"month\":2,\"year\":2020,\"hour\":4,\"minute\":5},\"endDate\":{\"day\":5,\"hour\":2,\"minute\":1,\"month\":4,\"year\":3},\"type\":\"DEADLINE\"}]

Я действительно хотел бы знать, в чем проблема GSON?

Класс проекта:

public class Project {

    @SerializedName("id")
    private int id;
    @SerializedName("name")
    private String name;
    @SerializedName("description")
    private String description;
    @SerializedName("comments")
    private ArrayList<Comment> comments;
    @SerializedName("appointments")
    private Collection<Appointment> appointments;
    @SerializedName("handlers")
    private Collection<User> handlers;
    @SerializedName("processors")
    private Collection<User> processors;
    @SerializedName("type")
    private ProjectType projectType;

// constructor, getter, setter,...
}

Класс встречи:

public class Appointment {

    private int id;
    private String name;
    private String description;
    private Date startDate;
    private Date endDate;
    @SerializedName("type")
    private AppointmentType appointmentType;

    // constructor, getter, setter,...
}

Странно то, что если я заполняю, например, массив комментариев данными и устанавливаю массив встреч пустым - используя ту же структуру json (I думаю) - работает нормально. см. ниже:

"[{\"id\":1,\"content\":\"Der Wilde Westen war im 19. Jahrhundert!\",\"restricted\":true,\"wasEdited\":false,\"creationTime\":{\"day\":1,\"month\":5,\"year\":2020,\"hour\":12,\"minute\":30},\"author\":{\"id\":1,\"username\":\"LuckyLuke\",\"email\":\"luckyluke@web.de\",\"roles\":[\"ROLE_ADMIN\"],\"userInfo\":{\"id\":1,\"forename\":\"Lucky\",\"surname\":\"Luke\",\"studentNumber\":1234567}}},{\"id\":2,\"content\":\"Cowboys sind ja so doof!\",\"restricted\":false,\"wasEdited\":true,\"creationTime\":{\"day\":3,\"month\":5,\"year\":2020,\"hour\":15,\"minute\":49},\"author\":{\"id\":3,\"username\":\"JackDalton\",\"email\":\"jackdalton@web.de\",\"roles\":[\"ROLE_USER\"],\"userInfo\":{\"id\":3,\"forename\":\"Jack\",\"surname\":\"Dalton\",\"studentNumber\":7654312}}}]"

Я знаю, это может быть слишком много ввода, но я действительно на грани отчаяния ..

EDIT1:

projectString показано выше

Project projekt = newGson().fromJson(projectString, Project.class);

1 Ответ

0 голосов
/ 26 мая 2020

Ладно, сам решил.

Видимо, GSON не любит Inheritage. Я передал идентификатор пользователя (User.class) его подклассу UserInfo (UserInfo.class)

Я удалил наследство, теперь все работает нормально ..

...