2017-02-06 11 views
2

Я использую Retrofit + Gson для разбора JSON.Как исправить разбор Gson JSON от LinkedTreeMap до ArrayList?

Когда я пытаюсь разобрать ответ из Google Places API (хорошо, я не пытаюсь разобрать, я просто пытаюсь создать модель для этого ответа), и я получаю некоторую ошибку.

Это ответ от Google Место API:

{ 
    "predictions" : [ 
     { 
     "description" : "Николаевская область, Украина", 
     "id" : "3bd747cc4efc2288da48942b909ce18a053c2060", 
     "matched_substrings" : [ 
      { 
       "length" : 5, 
       "offset" : 0 
      } 
     ], 
     "place_id" : "ChIJydRVsbqaxUARLq1R8Q3RgpM", 
     "reference" : "ClRPAAAAwseWiG8NUMt7TqSqz9rMP8R2M4rX7-cMRmIp4OCYL-VdRSr5B5T_PMwWzYOydVStVpYDvm0ldXYPEzxFAuvn1LqhtWHdROhsERwvmx0tVlwSEFdMw0sOe3rDaB2AqKKmF-YaFLvhiEOz3Bklv5-iTa7QQORILVCU", 
     "structured_formatting" : { 
      "main_text" : "Николаевская область", 
      "main_text_matched_substrings" : [ 
       { 
        "length" : 5, 
        "offset" : 0 
       } 
      ], 
      "secondary_text" : "Украина" 
     }, 
     "terms" : [ 
      { 
       "offset" : 0, 
       "value" : "Николаевская область" 
      }, 
      { 
       "offset" : 22, 
       "value" : "Украина" 
      } 
     ], 
     "types" : [ "administrative_area_level_1", "political", "geocode" ] 
     }, ...], 
    "status" : "OK" 
} 

Это моя модель для этого ответа:

public class GetGoogleMapPlacesResponse { 
    @SerializedName("predictions") 
    private List<GooglePlace> googlePlaces; 

    public List<GooglePlace> getGooglePlaces() { 
     return googlePlaces; 
    } 

    public void setGooglePlaces(List<GooglePlace> googlePlaces) { 
     this.googlePlaces = googlePlaces; 
    } 
} 

Но когда дооснащения попробовать, чтобы разобрать ответ на модели я получаю сообщение об ошибке:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.myapp.net.rest.response.GetGoogleMapPlacesResponse 

И это необработанный ответ в режиме отладки: enter image description here

+0

Это может быть полезно для вас , http://stackoverflow.com/questions/22285661/gson-json-and-the-subtleties-of-linkedtreemap –

+0

У меня была эта проблема один раз, когда я использовал дженерики в моделях, это не ваше право? – mayosk

+0

@mayosk нет, в этом вопросе я не использую generics – Artem

ответ

1

Вам не хватает конструктора модели GetGoogleMapPlacesResponse.

public class GetGoogleMapPlacesResponse { 
    private List<GooglePlace> googlePlaces; 
    private String status; 

    public GetGoogleMapPlacesResponse(List<GooglePlace> googlePlaces, String status) { 
     this.googlePlaces = googlePlaces; 
     this.status = status; 
    } 

    ...getters & setters 
} 

Но я настоятельно рекомендую вам использовать Автозначение с расширением Gson и тогда ваша модель будет выглядеть следующим образом:

@AutoValue 
public abstract class GetGoogleMapPlacesResponse { 
     @SerializedName("predictions") public abstract List<GooglePlace> googlePlaces; 
     public abstract String status; 
} 

Для получения дополнительной информации смотрите здесь: https://github.com/rharter/auto-value-gson

+0

первое решение для меня не работает, второе - я думаю об этом, но я не хочу использовать библиотеки гринов. – Artem

+0

1: метод вставки, вызывающий ошибку (как вы получаете доступ этот список прогнозов) 2: просто используйте его, неизменность и удобочитаемость - это способ пойти – mayosk

+0

@mayosk Gson не требует создания конструкторов для создания экземпляра во время десериализации. Проблема, с которой сталкивается OP, - это некорректное литье. –