我正在尝试创建一个基于动态响应的转换器
使用改造,至于现在我有2个不同的答案从服务器返回 - 一个表示失败,一个表示有效的响应如何使用相同的适配器\ callabck尝试解析两个不同的对象?
答案 0 :(得分:0)
如果数据是json数据,则可以将其解析为java bean。 你可以使用Gson来解析它。
1添加lib
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.7'
2创建改造 private Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build();
只需添加一个Gson转换器。
例如,
// success
{"retcode":0,"result":{"vfwebqq":"xxxx"}}
// failed
{"retcode":100,"result":{}}
3创建一个bean来接收数据。
public class Result {
public String retcode;
public Info result;
public static class Info {
public String vfwebqq;
}
}
4然后你可以在改造界面中返回一个bean对象。
@GET("xxx")
Result getHome();
答案 1 :(得分:0)
实际上,我并不是在谈论你在说什么以及你面临的确切问题。但是,从我脑海中浮现的第一件事就是提供自定义JsonDeserializer。它应该像这样看起来像smth:
public class CustomDeserializer implements JsonDeserializer<List<CustomData>> {
@Override
public List<CustomData> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
List<CustomData> customDataSet = new ArrayList<>();
Iterator<JsonElement> iterator = ((JsonObject) json).get("data").getAsJsonObject().get(
"records").getAsJsonArray().iterator();
while (iterator.hasNext()) {
JsonElement element = iterator.next();
CustomData customData = ServiceGenerator.mGson.fromJson(element, CustomData.class);
customDataSet.add(customData);
}
return customDataSet;
}
}
这只是一个自定义解析器类示例,它应用于RetrofitBuilder只是为了让生活更轻松(也许)。 之后你需要:
Type listType = new TypeToken<List<CustomData>>() {
}.getType();
mGson = new GsonBuilder().registerTypeAdapter(listType, new CustomDeserializer()).create();
builder =
new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(mGson))
.baseUrl(API_BASE_URL);
retrofit = builder.build();
答案 2 :(得分:0)
根据您的问题,我相信这个网站可以帮助您应对挑战:
https://futurestud.io/tutorials/retrofit-2-introduction-to-multiple-converters