2015-08-19 5 views
0

Я сохраняю свой список с помощью gson, и когда я его читаю, у меня проблемы. Проблема в том, что List List, который я отправляю, имеет два разных типа объектов. Один из них - CourseHeader, а другой - CourseInfo. Вот код, я прямо сейчас:GSON deserialize список с двумя различными типами объектов в Android

Type type = new TypeToken<List>(){}.getType(); 
     List OLDcoursesArrayList = gson.fromJson(courseDataString, type); 

В этой части: TypeToken < Список> я могу сделать что-то вроде этого:

TypeToken<List<CourseHeader>> 

Но поскольку существуют два различных объекта в списке , только тех, кто работает с CourseHeader, работают, когда я их использую. Я хочу знать, могу ли я сделать что-то вроде этого:

TypeToken<List<CourseHeader, CourseInfo>> 

Или, если я могу получить список какой-то другой способ, чтобы получить как мои различные объекты в списке.

ответ

2

Хорошо для кого-то, кто может столкнуться с этой проблемой (разбор списка, который может иметь два различных типа данных объектов), то я немного Hacky решение:

Gson gson = new Gson(); 
     String courseDataString = courseData.getString("courseList", ""); 
     JsonArray courseDataArray = new JsonParser().parse(courseDataString).getAsJsonArray(); 
     List NEWcoursesArrayList = new ArrayList(); 

     for(JsonElement json : array){ 
      if(json.toString().contains("header")) { 
       NEWcoursesArrayList.add(gson.fromJson(json, CourseHeader.class)); 
      } 
      else{ 
       NEWcoursesArrayList.add(gson.fromJson(json, CourseInfo.class)); 
      } 
     } 

Так что мы делая это, мы получаем строку Json как обычно и преобразуем ее в JsonArray. Поэтому мы используем JsonParser для разбора строки, а затем вызываем «getAsJsonArray», чтобы получить JsonArray. Этот массив будет выглядеть следующим образом:

[{ "заголовок": "пункт", "topSeperator": 0}, { "notheader": "пункт", "topSeperator": 0}]

После этого Я создаю свой объект List без определенного типа.

Затем я использую цикл for, который проходит через массив Json с использованием итератора JsonElement и преобразует каждый элемент в строку. Я использую строку, чтобы проверить, если он содержит сказать, например, «заголовок», если он потом добавить товар в мой список, используя

List.add(gson.fromJson(json, OBJECTTYPE.class) 

Так что вы можете сделать, это, вы можете иметь переменную внутри вашей объекты, которые указывают, какой тип объекта они являются. Переменная, как:

String objectType = "OBJECTTYPE"; 

Тогда при преобразовании каждого элемента внутри массива Json в строку, проверьте, чтобы увидеть, если строка содержит «OBJECTTYPE», если это произойдет, то добавить объект, как обычно, с помощью .add (gson.fromJson (json iterator, тип object.class)

Это хакерское решение, но оно работает, если у вас есть список с двумя разными типами данных. Я уверен, что есть лучшее решение.

0

Я думаю, вам нужно будет создать список объектов CourseObject, оба из которых являются суперклассами классов CourseHeader и CourseInfo.

В вашем синтаксическом анализе вы можете использовать интроспекцию на получаемом объекте, чтобы увидеть, что вам нужно для его создания, прежде чем оно будет сохранено в списке.

+0

Я думал об этом, но не хочу, чтобы мои объекты Курса наследовали от чего-либо, и если бы я был в другой ситуации (какой я буду), где они наследуются от разных суперклассов, тогда я woul d застрять снова.Использование интерфейса также не помогает, поскольку, по-видимому, делает список типом интерфейса, а затем пытается использовать элементы внутри него для объектов курса, которые его реализуют, дает мне нарушения памяти. – SigmaO

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