我使用RetroFit与我的API进行通信。响应是JSON,其中一个JSON对象(' user')是一个字符串。我想将该字符串解析为JSON。
我有一个响应课:
public class TokenModel {
@SerializedName("access_token")
private String accessToken;
@SerializedName(".expires")
private String expiryDate;
private UserModel user;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getExpiryDate() {
return expiryDate;
}
public void setExpiryDate(String expiryDate) {
this.expiryDate = expiryDate;
}
public UserModel getUser() {
return user;
}
public void setUser(UserModel user) {
this.user = user;
}
}
和用户的类:
public class UserModel {
private int id;
private String email;
private String firstName;
private String lastName;
private String profileImageUrl; etc...
但是,因为'用户'响应中的对象是一个需要首先解析为JSON的字符串。我不确定如何做到这一点,仍然可以使用该模型。有没有办法告诉RetroFit在将它应用到模型之前首先将其解析为JSON?
谢谢你, 丹尼尔
答案 0 :(得分:1)
使用@ corsair992的建议,结果非常简单。
创建自定义反序列化器以将字符串解析为Json:
public class UserDeserializer implements JsonDeserializer<UserModel> {
@Override
public UserModel deserialize(JsonElement jsonElement, Type typeOF,
JsonDeserializationContext context)
throws JsonParseException {
String userString = jsonElement.getAsString();
JsonElement userJson = new JsonParser().parse(userString);
return new Gson().fromJson(userJson, UserModel.class);
}
}
然后将其设置为其余适配器上的转换器:
RestAdapter restAdapter = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.FULL)
.setConverter(new GsonConverter(new GsonBuilder().registerTypeAdapter(UserModel.class, new UserDeserializer()).create()))
.setEndpoint(getString(R.string.url_base))
.build();
现在将把字符串转换为Json并使其与模型一起运行。