2015-03-19 62 views
0

我正在Android上處理API請求與Retrofit(1.9.0)和gson庫(1.7.0我與gson版本2.3.1有兼容性問題),我提出了一些要求到一個具有相同的響應格式但在url調用之後有不同內容的API,但是我遇到了一個數組裏面有一個答案的反序列化問題。這是我想反序列化JSON的例子:Retrofit android:gson數組內容反序列化

{ 
    "http_code":200, 
    "content":[ 
     { 
     "name":"Groult Christian", 
     "location":[ 
      48.897655, 
      2.252462 
     ], 
     "website":null, 
     "address":{ 
      "street_address":"XXXXXX", 
      "city":"XXXXXX", 
      "state":null, 
      "postal_code":"XXXXXX", 
      "country":"XXXXXX" 
     }, 
     "global_score":0, 
     "popularity_score":0, 
     "quality_score":0, 
     "createdAt":"2015-02-18T02:13:05.068Z", 
     "updatedAt":"2015-02-18T02:13:05.068Z", 
     "id":"54e3f531775288ca572872ac" 
     }, 
     ... 
    ] 
} 

我DeserializerJson,我怎麼稱呼它改造:

public class DeserializerJson<T> implements JsonDeserializer<T> { 

     @Override 
     public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
       throws JsonParseException 
     { 
      // Get the "content" element from the parsed JSON 
      JsonElement content = je.getAsJsonObject().get("content"); 

      // Deserialize it. You use a new instance of Gson to avoid infinite recursion 
      // to this deserializer 
      return new Gson().fromJson(content, type); 

     } 
    } 
... 
Gson gson = new GsonBuilder() 
       .registerTypeAdapter(ContentUser.class, new DeserializerJson<ContentUser>()) 
       .registerTypeAdapter(DeviceInfo.class, new DeserializerJson<DeviceInfo>()) 
       .registerTypeAdapter(PlacesModel.class, new DeserializerJson<PlacesModel>()) 
       .create(); 

     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setLogLevel(RestAdapter.LogLevel.BASIC) 
       .setConverter(new GsonConverter(gson)) 
       ... 
... 

和我不同的型號:

public class PlacesModel { 
    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("location") 
    @Expose 
    private List<Double> location = new ArrayList<Double>(); 
    @SerializedName("website") 
    @Expose 
    private Object website; 
    @SerializedName("address") 
    @Expose 
    private AddressModel address; 
    @SerializedName("global_score") 
    @Expose 
    private Integer globalScore; 
    @SerializedName("popularity_score") 
    @Expose 
    private Integer popularityScore; 
    @SerializedName("quality_score") 
    @Expose 
    private Integer qualityScore; 
    @SerializedName("createdAt") 
    @Expose 
    private String createdAt; 
    @SerializedName("updatedAt") 
    @Expose 
    private String updatedAt; 
    @Expose 
    @SerializedName("id") 
    private String id; 

    /* Getters and Setters... */ 
} 

public class AddressModel { 

    @SerializedName("street_address") 
    @Expose 
    private String streetAddress; 
    @SerializedName("city") 
    @Expose 
    private String city; 
    @SerializedName("state") 
    @Expose 
    private Object state; 
    @SerializedName("postal_code") 
    private String postalCode; 
    @SerializedName("country") 
    @Expose 
    private String country; 

    /* Getters and Setters... */ 
} 

URL調用在Api Manager中是這樣的:

@GET("/places") 
public void getPlaces(RestCallback<List<PlacesModel>> callback); 

但是當我打電話時,我得到這個錯誤:com.google.gson.JsonParseException: The JsonDeserializer [email protected]6 failed to deserialize json object

其他調用的一切都很好我得到的所有內容,所以沒有問題,但有一個數組裏面有內容我有一個錯誤,我不明白爲什麼我相信如果我只是把我的模型列表,它會很好,但它不起作用。 我想我錯過的東西,所以如果有人能幫助我

在此先感謝

+0

這是完整的堆棧跟蹤?如果不是,請在您的問題中發佈完整的堆棧跟蹤。 – iRuth 2015-03-19 07:36:04

+0

是的,它幾乎是完整的堆棧跟蹤,在這個錯誤之後只有我想要反序列化的json – flo3573358 2015-03-19 07:39:56

+0

堆棧跟蹤中是否有行號顯示導致JsonParseException的代碼部分? – iRuth 2015-03-19 07:42:58

回答

1

您的問題的問題是,你註冊DeserializerJsonPlacesModel類和getPlaces方法你的反應是List<PlacesModel>類。 List<PlacesModel>是與PlacesModel不同的類,所以Gson不知道如何反序列化List<PlacesModel>。你所要做的就是用這種方法註冊一個多解串器:

.registerTypeAdapter(List.class, new DeserializerJson<List<PlacesModel>>()) 

如果使用不止一種類型的List(我的意思是List<PlacesModel>List<DeviceInfo>)您可以定義自己的TypeAdapter或者你CN改變列表排列併爲它們註冊反串行器,如下所示

.registerTypeAdapter(PlacesModel[].class, new DeserializerJson<PlacesModel[]>()) 

現在一切工作正常你的json。