Java 使用安卓改型解析嵌套JSON
我使用改型是为了与我的API通信。响应是JSON,其中一个JSON对象('user')是字符串。我想将该字符串解析为JSON 我有一个课程来回答:Java 使用安卓改型解析嵌套JSON,java,android,json,rest,retrofit,Java,Android,Json,Rest,Retrofit,我使用改型是为了与我的API通信。响应是JSON,其中一个JSON对象('user')是字符串。我想将该字符串解析为JSON 我有一个课程来回答: public class TokenModel { @SerializedName("access_token") private String accessToken; @SerializedName(".expires") private String expiryDate; private UserModel
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...
但是,由于响应中的“user”对象是字符串,因此需要首先将其解析为JSON。我不确定如何做到这一点,仍然使它与模型的工作。有没有一种方法可以告诉改型在将其应用到模型之前先将其解析为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);
}
}
这将把字符串转换成Json,并使其与模型一起工作。因此,更改响应格式以使用Json对象?@corsair992很遗憾,它无法更改,需要由客户端解析。您可以通过注册自定义
TypeAdapter
s自定义GSON脱敏,然后在RestAdapter
上设置一个自定义的GsonConverter
。四处搜索,你会找到很多关于如何操作的示例和教程。这个问题真的应该被标记为一个重复的问题,因为我确信这已经在堆栈溢出上发布过了。
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();