2017-01-01 77 views
6

我需要反序列化一個包含數組的Json文件。我知道如何反序列化它,以便獲得一個List對象,但在框架中,我使用了一個不實現Java List接口的自定義列表對象。我的問題是,如何爲我的自定義列表對象編寫反序列化器?如何在Gson中創建自定義列表反序列化器?

編輯:我想解串器是通用的,這意味着我希望它爲每一種名單的逾時工作,像CustomList<Integer>CustomList<String>CustomList<CustomModel>不只是一個特定類型的列表,因爲這將是煩人,使解串器,每善良的我使用。

+2

你爲什麼不先用Java類第一反序列化,然後寫出自己的變壓器將自定義列表對象? –

+0

看看[這個](http://stackoverflow.com/questions/16590377/custom-json-deserializer-using-gson) –

+0

@ReazMurshed我可以做到這一點,但我反序列化成一個對象模型,然後我在我的其他代碼中使用。我可以創建一個ModelJson類和一個Model類,其中ModelJson類使用來自Java的List接口,並且僅用於反序列化,並將其轉換爲Model類。問題在於我有很多類可以這樣做,所以這有點痛苦,而且我很好奇是否有更優雅的解決方案。如果沒有,我會走硬編碼路徑,但我希望我不會。 – BananyaDev

回答

2

這是我想出了:

class CustomListConverter implements JsonDeserializer<CustomList<?>> { 
    public CustomList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) { 
     Type valueType = ((ParameterizedType) typeOfT).getActualTypeArguments()[0]; 

     CustomList<Object> list = new CustomList<Object>(); 
     for (JsonElement item : json.getAsJsonArray()) { 
      list.add(ctx.deserialize(item, valueType)); 
     } 
     return list; 
    } 
} 

註冊這樣的:

Gson gson = new GsonBuilder() 
     .registerTypeAdapter(CustomList.class, new CustomListConverter()) 
     .create(); 
+0

對不起,延遲迴復。你的回答確實是正確的。我非常感謝你,先生。 – BananyaDev