2017-01-01 5 views
6

Мне нужно десериализовать Json-файл с массивом. Я знаю, как десериализировать его, чтобы получить объект List, но в структуре я использую пользовательский объект списка, который не реализует интерфейс Java List. Мой вопрос: как написать десериализатор для моего пользовательского объекта списка?Как создать собственный десериализатор списка в Gson?

EDIT: Я хочу десериализатор быть универсальным, что означает, что я хочу его отъ работы для каждого вида списка, как CustomList<Integer>, CustomList<String>, CustomList<CustomModel> не только конкретный вид списка, так как это будет раздражать, чтобы сделать десериализатор для каждого вид я использую.

+2

Почему вы не десериализации его первый с Java класс первый, а затем написать свой собственный трансформатор на пользовательский объект списка? –

+0

Посмотрите на [this] (http://stackoverflow.com/questions/16590377/custom-json-deserializer-using-gson) –

+0

@ReazMurshed Я мог бы это сделать, но я десериализую его в объектную модель, чтобы потом используйте в остальной части моего кода. Я мог бы создать класс ModelJson и класс Model, где ModelJson использует интерфейс List из Java и используется только для десериализации, преобразовывая его после класса 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

Смежные вопросы