我从我的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值?任何答案将不胜感激...
答案 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转换,它更简单