Retrofit android: gson数组内容反序列化

Retrofit android: gson array content deserialization

我正在 API Android 上使用 Retrofit(1.9.0) 和 gson 库(1.7.0 我与 gson 2.3.1 版有兼容性问题)的请求,我向 API 发出一些请求,它在 url 调用后具有相同的响应格式但内容不同,但我遇到了一个反序列化内部数组的答案的问题。这是我要反序列化的 json 的示例:

{
   "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经理是这样的:

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

但是当我调用时出现此错误:com.google.gson.JsonParseException: The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@3b8aa06 failed to deserialize json object

其他调用一切正常,我得到了所有内容,所以没有问题,但内容中有数组的地方我收到错误,我不明白为什么我相信如果我只是列出我的模型它会很好,但它不起作用。 我想我错过了一些东西所以如果有人可以帮助我

提前致谢

您的问题是您为 PlacesModel class 注册了 DeserializerJson,并且在 getPlaces 方法中您的响应是 List<PlacesModel> class。 List<PlacesModel>PlacesModel 不同 class,因此 Gson 不知道如何反序列化 List<PlacesModel>。你要做的就是通过这个方法再注册一个Deserialiser:

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

如果你使用不止一种类型的List(我的意思是List<PlacesModel>List< DeviceInfo >)你可以定义你自己的TypeAdapter或者你cN改变列表到数组并为它们注册解串器,如下所示

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

现在您的 json.

一切正常