使用 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 转换更简单
我正在使用我的 android 应用中的 API,所有 JSON 响应都是这样的:
{"firms":[{"firm_name":"f1"},{"firm_name":"f2"}]}
我所做的是仅创建一个包含字段 "firm_name"
的 POJO classclass 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 转换更简单