亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 gson 和 JsonWriter 反序列化對象數組

如何使用 gson 和 JsonWriter 反序列化對象數組

Qyouu 2022-05-25 15:40:49
我有以下課程:public class MeetingCenter {    private String name;    private List<MeetingRoom> meetingRoomList;}public class MeetingRoom {    private MeetingCenter meetingCenter;    private String code;    private String name;    private List<Reservation> reservationList;}public class Reservation {    private MeetingRoom meetingRoom;    private String owner;}我想創建一個具有以下模式的 JSON:這個方法在我調用 toJson() 方法的那一行拋出了一個異常:private static void exportToJson(List<MeetingCenter> mcs) throws IOException {    Gson gson = new Gson();    String data = gson.toJson(mcs);    JsonWriter writer = new JsonWriter(new FileWriter("export.json"));    writer.setIndent("    "); // set indent    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.endObject(); // document end    writer.close();}例外:Exception in thread "main" java.lang.StackOverflowError    at java.lang.StringBuffer.append(StringBuffer.java:380)    at java.io.StringWriter.write(StringWriter.java:77)    at com.google.gson.stream.JsonWriter.beforeName(JsonWriter.java:614)    at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:401)    at com.google.gson.stream.JsonWriter.beginArray(JsonWriter.java:287)    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:95)    ....
查看完整描述

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",


         ...


查看完整回答
反對 回復 2022-05-25
?
PIPIONE

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();


查看完整回答
反對 回復 2022-05-25
  • 2 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號