使用Gson和Retrofit(自定义反序列化器)进行Json解析

时间:2018-10-25 12:48:52

标签: android json parsing gson retrofit

我需要构建位置列表(通过response数组创建place的实例,最后接收位置列表(在json中为place)吗?

如何使用Gson和Retrofit以及自定义反序列化器来解析它?

我有以下结构:

{
"success": true,
"error": null,
"response": [
   {
      "loc": {
          "lat": 51.50853,
          "long": -0.12574
      },
      "place": {
           "name": "London",
           "state": "",
           "stateFull": "",
           "country": "GB",
           "countryFull": "United Kingdom",
           "region": "",
           "regionFull": "",
           "continent": "eu",
           "continentFull": "Europe"
       },
       "profile": {
           "elevM": 21,
           "elevFT": 69,
           "pop": 7556900,
           "tz": "Europe/London",
           "tzname": "BST",
           "tzoffset": 3600,
           "isDST": true,
           "wxzone": null,
           "firezone": null,
           "fips": null,
           "countyid": null
        }
      },
       .............
       .............
    ]
}

1 个答案:

答案 0 :(得分:0)

您可以使用Android Studio插件RoboPOJOGenerator。从数据创建模型类非常容易。

This answer讲述了如何处理翻新中的列表响应。

img

更新

我认为让自定义解串器仅用于解析列表不是一个好主意。得到响应后可以过滤或映射列表的时间。最多需要3-4行代码。

如果您不想上很多课。那么您就可以安全地删除Profile.javaLoc.java了,Gson将仅解析在pojo中声明的数据。

设置通用响应类

您可以使用Java Generics将单个类用于处理所有响应。参见示例。

public class ApiResponse<T> {
    @SerializedName("error")
    @Expose
    private String error;
    @SerializedName("success")
    @Expose
    private boolean success;
    @SerializedName("response")
    @Expose
    private T response;

    // make getter setters
}

现在,您可以在ApiService中定义response类型。像这样

@GET("api/users/login")
Call<ApiResponse<ModelUser>> getUser();

@GET("api/users/login")
Call<ApiResponse<ModelCity>> getCity();

因此,您不必每次都创建3个类。该通用类将对所有响应起作用。