使用 RetroFit 解析嵌套 JSON Android
Parsing nested JSON using RetroFit for Android
我正在使用 RetroFit 与 API 进行通信。响应是 JSON 并且 JSON 对象之一 ('user') 是一个字符串。我想将该字符串解析为 JSON.
我有一个 class 的回复:
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;
}
}
和 class 用户:
public class UserModel {
private int id;
private String email;
private String firstName;
private String lastName;
private String profileImageUrl; etc...
但是,由于响应中的 'user' 对象是一个字符串,因此需要首先将其解析为 JSON。我不确定如何做到这一点,并仍然让它与模型一起工作。有没有办法告诉 RetroFit 在将其应用到模型之前首先将其解析为 JSON?
谢谢,
丹尼尔
事实证明使用@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 并使其与模型一起运行。
我正在使用 RetroFit 与 API 进行通信。响应是 JSON 并且 JSON 对象之一 ('user') 是一个字符串。我想将该字符串解析为 JSON.
我有一个 class 的回复:
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;
}
}
和 class 用户:
public class UserModel {
private int id;
private String email;
private String firstName;
private String lastName;
private String profileImageUrl; etc...
但是,由于响应中的 'user' 对象是一个字符串,因此需要首先将其解析为 JSON。我不确定如何做到这一点,并仍然让它与模型一起工作。有没有办法告诉 RetroFit 在将其应用到模型之前首先将其解析为 JSON?
谢谢, 丹尼尔
事实证明使用@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 并使其与模型一起运行。