Пользовательский десериализатор JSON с использованием Gson

У меня проблема с parsingом ответа JSON с использованием Gson.

Строка JSON:

response: [ 2, { owner_id: 23972237, album_id: 25487692, title: 'album not new' }, { owner_id: 23972237, album_id: 25486631, title: 'фыв' } ] 

У меня есть два classа:

 public class VkAudioAlbumsResponse { public ArrayList response; public VkError error; } public class VkAudioAlbum { public int owner_id; public int album_id; public String title; } 

Но у меня есть Исключение, когда разбирайте это с помощью Gson. Я знаю, это потому, что первый элемент массива ответа не является объектом, а целым.

Итак, вопрос в том, могу ли я как-то его решить?

Вы должны написать собственный десериализатор . Я бы сделал что-то вроде этого:

Сначала вам нужно включить новый class, а не 2, который у вас уже есть:

 public class Response { public VkAudioAlbumsResponse response; } 

И тогда вам нужен пользовательский десериализатор, что-то похожее на это:

 private class VkAudioAlbumsResponseDeserializer implements JsonDeserializer { @Override public VkAudioAlbumsResponse deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { JsonArray jArray = (JsonArray) json; int firstInteger = jArray.get(0); //ignore the 1st int VkAudioAlbumsResponse vkAudioAlbumsResponse = new VkAudioAlbumsResponse(); for (int i=1; i 

Тогда вам нужно десериализовать свой JSON, как:

 GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(VkAudioAlbumsResponse.class, new VkAudioAlbumsResponseDeserializer()); Gson gson = gsonBuilder.create(); Response response = gson.fromJson(jsonString, Response.class); 

С помощью этого подхода, когда Gson пытается десериализовать JSON в class Response , он обнаружил, что в этом classе есть response атрибута, который соответствует имени в ответе JSON, поэтому он продолжает parsing.

Затем он понимает, что этот атрибут имеет тип VkAudioAlbumsResponse , поэтому он использует созданный вами десериализатор для его синтаксического анализа, который обрабатывает оставшуюся часть ответа JSON и возвращает объект VkAudioAlbumsResponse .

Примечание. Код в десериализаторе довольно прост, поэтому, я думаю, у вас не будет проблем, чтобы понять его ... Для получения дополнительной информации см. Gson API Javadoc

  • Разбор JSON DateTime от JSON Serializer от Newtonsoft
  • Получить и проанализировать CSV-файл в android
  • Преобразование строки в int с помощью bool / fail в C ++
  • Как анализировать даты в нескольких форматах с помощью SimpleDateFormat
  • Разбор PDF-файлов (особенно с таблицами) с помощью PDFBox
  • Что конкретно представляют опасности eval (parse (...))?
  • Как разбирать данные JSON с помощью jQuery / JavaScript?
  • как редактировать XML с помощью скрипта bash?
  • Оценка математических выражений
  • Как обращаться к ошибке «bash:! D»: событие не найдено »в подстановке команды Bash
  • Парсер для C #
  • Давайте будем гением компьютера.