@Expose - это решение, позволяющее избежать исключения stackoverflow, но оператор
writer.name("data").value(data);
недопустим, поскольку данные будут обогащены escape-символом.Например, вы можете указать в поле данных
"data": "{\"name\": \"center 1\" ... }"
, что может вызвать проблемы на этапе десериализации.
Моя реализация предлагает класс Container для класса MeetingCenter, где схема иURI можно настроить.
/** Container class configures the schema and URI */
public class Container {
@Expose
private String schema;
@Expose
private String uri;
@Expose
private List<MeetingCenter> data;
}
public class Reservation {
private MeetingRoom meetingRoom;
@Expose
private String owner;
}
public class MeetingRoom {
private MeetingCenter meetingCenter;
@Expose
private String code;
@Expose
private String name;
@Expose
private List<Reservation> reservationList;
}
public class MeetingCenter {
@Expose
private String name;
@Expose
private List<MeetingRoom> meetingRoomList;
}
public class Main {
public static void main(String[] args){
Container container = meetingCenterInitialization();
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
// it is necessary to avoid stackoverflow
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
String jsonString = gson.toJson(container);
System.out.println(jsonString);
Container container1 = gson.fromJson(jsonString, Container.class);
System.out.println("\n\n\n\n" + container1.getData().get(0).getName());
}
}
Выход основного метода:
{
"schema": "PLUS4U.EBC.MCS.MeetingRoom_Schedule_1.0",
"uri": "ues:UCL-BT:UCL.INF/DEMO_REZERVACE:EBC.MCS.DEMO/MR001/SCHEDULE",
"data": [
{
"name": "center name",
"meetingRoomList": [
{
"code": "room 1",
...