前言
如果后端有时返回{value:""},有时返回{value:[]},retrofit和Gson该怎么配合,去兼容呢?这里我们就以这种情况举例,它对应的model是这样的
class TestRepo{
private String choice; // 对应{value:""}
private List<String> choices; //对应 {value:[]}
...
}
1. retrofit设置
Retrofit.Builder()
...
.addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()))
...
2. gsonBuilder设置
gsonBuilder.registerTypeAdapter(TestRepo.class,new TestRepoTypeAdapter())
TestRepo是Json解析的model名,TestRepoTypeAdapter是继承JsonDeserializer || JsonSerializer的对象。
3. XXTypeAdapter的实现
这里我们即继承JsonSerializer用于上传给后端的时候更改json串,也继承JsonDeserializer用于后端数据返回的时候将数据准确解析为我们的model。
public class TestTypeAdapter implements JsonDeserializer<TestRepo>, JsonSerializer<TestRepo> {
private Gson gson = new GsonBuilder().create();
@Override
public TestRepo deserialize(
JsonElement json, Type typeOfT, JsonDeserializationContext context
) throws JsonParseException {
TestRepo t = gson.fromJson(json, TestRepo.class);
JsonObject jsonObject = json.getAsJsonObject();
//todo 根据不同情况进行解析
// t.setChoice();
// t.setChoices();
return t;
}
@Override
public JsonElement serialize(
TestRepo src, Type typeOfSrc, JsonSerializationContext context
) {
JsonObject jsonObject = gson.fromJson(gson.toJson(src), JsonObject.class);
//todo 根据不同情况更改传给后端的json串
return jsonObject;
}
}
网友评论