簡體   English   中英

如何將不同的對象表示反序列化為POJO?

[英]How to deserialize different object representations to a POJO?

在客戶端上,我有一個對實體進行操作的Javascript應用程序,其中的某些對象是通過包裝對象引用的,該對象包含服務器端實例的唯一鍵-基本上是某種引用。 有些是按原樣處理的,所有實體字段都存在。

當我發送帶有修改的實體以將其持久保存在服務器上時,某些本身是實體的字段是引用,有些是完整的對象。

例如,假設我有Car,CarModel和Garage,則傳入的JSON可能如下所示:

{
    addedItems: [{
        "@class": "mydoamin.Car",
        belongsTo: {
            "key": "Unique_Garage_Key"
        },
        carModel: {
            name: "New Car Model",
            wheelSize: 14,
            doors: 5
        }
    },{
        "@class": "mydomain.Car",
        belongsTo: {
            "name": "New Garage"
        },
        carModel: {
            key: "Unique_Key_Of_Existing_Car_Model"
        }
    }]
}

為此,我需要一個靈活的反序列化程序,該程序可以將兩種格式反序列化為相應的域POJO。

從傑克遜文檔中獲得的信息,我啟動了一個反序列化器,但是我不知道如何正確編寫它。 我在反序列化器中得到的是JsonParser和DeserializationContext。 而且我認為可以通過將流解析兩次來實現,首先將其作為包裝對象,如果失敗,則嘗試將其讀取為域對象。 不幸的是,我看不到JsonParser可以做到這一點。

所以基本上我的反序列化方法是:

Car car;
try { 
    Wrapper carRef = jp.readValueAs(Wrapper.class);
    car = wrapper.unwrap(carRef);
} catch (Exception e) {
    // rewind the stream somehow...
    car = jp.readValueAs(Car.class);
}

有人可以評論一下JsonParser是否可行,以及如何完成反序列化案例的更好的主意嗎?

謝謝

TreeTraversingParser解決了該問題。

        JsonNode rootEntityNode = jp.readValueAsTree();
        TreeTraversingParser treeTraversingParser = new TreeTraversingParser(rootEntityNode, jp.getCodec());

之后,您可以分析解析的JsonNode的類型並使用正確的序列進行反序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM