2017-02-06 29 views
2

我使用Retrofit + Gson解析JSON。如何解決從LinkedTreeMap到ArrayList的Gson JSON解析?

當我嘗試從Google Places API解析響應(好吧,我不嘗試解析,我只是嘗試爲此響應制作模型),並且出現一些錯誤。

這是從谷歌廣場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否,在這個要求中我不使用泛型 – 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 
} 

但我強烈建議你使用AutoValue與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正面臨的問題是破碎類型轉換某處 –