使用Retrofit获取对象列表而不使用包装的内部类

时间:2015-11-14 10:17:42

标签: android json gson retrofit

我从我的Android应用程序中使用API​​,所有JSON响应都是这样的:

{"firms":[{"firm_name":"f1"},{"firm_name":"f2"}]}

我所做的只是创建一个包含字段" firm_name"

的POJO类
class Firms {
  private String firm_name;
 //setters and getters
} 

我的ApiService界面:

public interface ApiService {

  @POST("functions/firmNamesRequest.php")
Call<Firms> getFirm_name();
}

我的JsonDeserializer实现:

 public class FirmsDeserializer implements JsonDeserializer<Firms> {

@Override
public Firms deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    JsonObject jsonObject = json.getAsJsonObject();
    JsonElement jsonElement = jsonObject.get("firms").getAsJsonArray();

    return new Gson().fromJson(jsonElement, Firms.class); 
}

在我的LoginFragment里面实现了Retrofit的回调方法

 private void getFirmNamesToPopulateSpinner() {
    Gson firmsGson = new GsonBuilder()
                    .registerTypeAdapter(Firms.class, new FirmsDeserializer())
                    .create();

    ApiService apiService = ServiceGenerator.createService(ApiService.class, firmsGson);
    Call<Firms> call = apiService.getFirm_name();
    call.enqueue(new Callback<Firms>() {
        @Override
        public void onResponse(retrofit.Response<Firms> response, Retrofit retrofit) {  
          @Override
        public void onFailure(Throwable t) {

        }
    });
 }

我已经设法使用包装的POJO类ex来遍历公司对象列表。一个类FirmResponse,它包含一个类型为Firms的列表对象,而在Firms类中,我已插入字段firm_name。我认为FirmResponse类中只有一个对象是冗余的,并且有更好的方法来使用实现JsonDeserializer接口的特定API调用。我的问题是,是否有办法在onResponse回调中获取公司对象列表并迭代它们获取firm_name值?任何答案将不胜感激...

2 个答案:

答案 0 :(得分:0)

最后经过努力寻找解决问题的方法...我设法解决它...我做的是改造api调用返回一个类型Firms的数组所以我的ApiService接口:

public interface ApiService {

 @POST("functions/firmNamesRequest.php")
 Call<Firms[]> getFirm_name();
}

我的JsonDeserializer实现:

public class FirmsDeserializer implements JsonDeserializer<Firms[]> {

private static final String debugTag = "FirmsDeserializer";

@Override
public Firms[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

    JsonObject jsonObject = json.getAsJsonObject();

    return new Gson().fromJson(jsonObject.get("firms").getAsJsonArray(), Firms[].class);
}
}

解决问题的技巧是在我的LoginFragment内部和Retrofit的回调onResponse()方法的实现......我做的是将POJO响应对象“响应”分配给类型为Firms的数组对象...所以简单..

 private void getFirmNamesToPopulateSpinner() {
Gson firmsGson = new GsonBuilder()
                .registerTypeAdapter(Firms.class, new FirmsDeserializer())
                .create();

ApiService apiService = ServiceGenerator.createService(ApiService.class, firmsGson);
Call<Firms> call = apiService.getFirm_name();
call.enqueue(new Callback<Firms>() {
    @Override
    public void onResponse(retrofit.Response<Firms> response, Retrofit retrofit) {  
     Firms[] firms = response.body();
    for ( int i=0; i<firms.length; i++) {
                Log.d(debugTag,  firms[i].getFirm_name());
            }
  } 
      @Override
    public void onFailure(Throwable t) {

    }
});
  }

答案 1 :(得分:0)

使用序列化改造调用吗?您可以使用@SerializedName("firm_name")设置Firms类变量,然后使用List<Firm>而不是Firm[]进行Retrofit调用。比起进行GSON转换,它更简单