使用 Retrofit 在不使用包装内部 类 的情况下获取对象列表

get list of Objects without using wrapped inner classes using Retrofit

我正在使用我的 android 应用中的 API,所有 JSON 响应都是这样的:

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

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

的 POJO class
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 classes ex 遍历公司对象列表。 class FirmResponse,其中包含公司类型的列表对象和公司内部 class 我已插入字段 firm_name。我认为只有内部对象的 FirmResponse class 是多余的,并且有更好的方法来使用实现 JsonDeserializer 接口的特定 API 调用。我的问题是是否有办法在 onResponse 回调中获取公司对象列表并遍历它们以获得 firm_name 值?任何答案将不胜感激...

终于在努力找出解决我问题的方法之后...我设法解决了它...我所做的是进行改造 api 调用 return 数组输入公司所以我的 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 响应对象 "response" 分配给 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) {

    }
});
  }

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