2 回答

TA貢獻1829條經驗 獲得超6個贊
@Expose 是避免 stackoverflow 異常的解決方案,但該語句
writer.name("data").value(data);
無效,因為數據將使用轉義字符豐富。例如,您可以在數據字段中擁有
"data": "{\"name\": \"center 1\" ... }"
所以反序列化階段可能會出現問題。
我的實現為 MeetingCenter 類提出了一個 Container 類,可以在其中配置模式和 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",
...

TA貢獻1829條經驗 獲得超9個贊
您的對象都引用了它們的父對象。
GSON 查看 aMeetingCenter然后嘗試序列化其子MeetingRooms。s對MeetingRooms 有引用MeetingCenter,所以 GSON 繞著圈轉,直到你得到一個堆棧溢出。
要解決此問題,您可以確保只暴露孩子而不暴露父母。已經有很多問題表明了這一點。請參閱序列化期間的 Java Gson 排除字段。
例如,您Reservation可能看起來像這樣:
class Reservation {
MeetingRoom meetingRoom;
@Expose
String owner;
}
我會把剩下的留給你。
writer.endArray()此外,當您尚未啟動數組時,您有一個方法調用。刪除該行。
writer.beginObject(); // document start
writer.name("schema").value("PLUS4U.EBC.MCS.MeetingRoom_Schedule_1.0");
writer.name("uri").value("ues:UCL-BT:UCL.INF/DEMO_REZERVACE:EBC.MCS.DEMO/MR001/SCHEDULE");
writer.name("data").value(data);
//writer.endArray(); removed
writer.endObject(); // document end
writer.close();
添加回答
舉報