【发布时间】:2017-12-26 13:33:41
【问题描述】:
我正在尝试从我的 Web 服务获取 JSON 并反序列化为我的类 UserSync,但我收到以下错误:
无法从字符串值 ('') 实例化类型 [简单类型,com.example.breno.teste.model.User] 类型的值;没有单字符串构造函数/工厂方法 在 [来源:okhttp3.ResponseBody$BomAwareReader@fbf814f;行:1,列:86](通过引用链:com.example.breno.teste.dto.UserSync["user"])
我读过一些帖子说我需要在 UserSync 中声明我的用户类静态,但是当我这样做时,杰克逊找不到任何用户属性,即使使用 JsonDescription。另一个帖子说我可能需要声明一个默认构造函数,所以我做了。
这是 UserSync 类:
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserSync {
@JsonProperty("status")
private String Status;
@JsonProperty("currentDate")
private String CurrentDate;
@JsonProperty("message")
private String Message;
@JsonProperty("user")
private static User NewUser;
public UserSync() {
}
public String getStatus() {
return Status;
}
public String getCurrentDate() {
return CurrentDate;
}
public String getMessage() {
return Message;
}
public static User getNewUser() {
return NewUser;
}
用户类:
public class User implements Serializable {
@JsonProperty("userKey")
private UUID UserKey;
@JsonProperty("userPassword")
private String UserPassword;
@JsonProperty("userGroupKey")
private UUID UserGroupKey;
@JsonProperty("signInDate")
private String SignInDate;
@JsonProperty("active")
private boolean Active;
@JsonProperty("profilePicturePath")
private String ProfilePic;
@JsonProperty("completeName")
private String UserCompleteName;
@JsonProperty("email")
private String UserEmail;
@JsonProperty("isLogged")
private boolean IsLogged;
public User() {
}
public boolean getIsLogged() {
return IsLogged;
}
public void setIsLogged(boolean isLogged) {
IsLogged = isLogged;
}
public String getUserEmail() {
return UserEmail;
}
public void setUserEmail(String userEmail) {
UserEmail = userEmail;
}
public UUID getUserKey() {
return UserKey;
}
public void setUserKey(UUID userKey) {
UserKey = userKey;
}
public String getUserPassword() {
return UserPassword;
}
public void setUserPassword(String userPassword) {
UserPassword = userPassword;
}
public UUID getUserGroupKey() {
return UserGroupKey;
}
public void setUserGroupKey(UUID userGroupKey) {
UserGroupKey = userGroupKey;
}
public String getSignInDate() {
return SignInDate;
}
public void setSignInDate(String signInDate) {
SignInDate = signInDate;
}
public boolean getActive() {
return Active;
}
public void setActive(boolean active) {
Active = active;
}
public String getProfilePic() {
return ProfilePic;
}
public void setProfilePic(String profilePic) {
ProfilePic = profilePic;
}
public String getUserCompleteName() {
return UserCompleteName;
}
public void setUserCompleteName(String userCompleteName) {
UserCompleteName = userCompleteName;
}
}
我的服务类(现在使用 postNewUser):
public interface UserService {
@GET("Login/LoginUser?")
Call<UserSync> login(@Query("email") String email, @Query("password") String password);
//region NewUser Services
@GET("Login/VerifyNewUser?")
Call<UserSync> validateNewUser(@Query("email") String email);
@POST("Login/PostNewUser")
Call<UserSync> postNewUser(@Body User user);
//endregion
}
最后是 JSON:
{
"status": "OK",
"currentDate": "20/07/2017 11:59:02",
"message": "teste",
"user": {
"userKey": "8e2f0d2d-3522-472d-be1d-28791367f4ee",
"email": "teste_teste@hotmail.com",
"userPassword": "123456",
"profilePicturePath": "teste",
"completeName": "Jorge",
"userGroupKey": null,
"signInDate": "2017-07-07T16:26:06.097",
"active": true,
"isLogged": true
}
}
有人可以帮帮我吗?
编辑 1 - 这是我用来进行改造调用的方法:
public void register(User user) {
Call<UserSync> postCall = new RetrofitInitializator().getUserService().postNewUser(user);
postCall.enqueue(getRegisterCallback());
}
@NonNull
private Callback<UserSync> getRegisterCallback() {
return new Callback<UserSync>() {
@Override
public void onResponse(Call<UserSync> call, Response<UserSync> response) {
User user = response.body().getNewUser();
}
@Override
public void onFailure(Call<UserSync> call, Throwable t) {
Log.e("Register - onFailure", t.getMessage());
}
};
}
EDIT 2 - 改造初始化器类:
public class RetrofitInitializator {
private final Retrofit retrofit;
public RetrofitInitializator() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient
.Builder();
builder.addInterceptor(interceptor);
retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.15.6:7071/api/")
.addConverterFactory(JacksonConverterFactory.create())
.client(builder.build())
.build();
}
public UserService getUserService() {
return retrofit.create(UserService.class);
}
}
【问题讨论】:
-
向我们展示您如何创建改造服务类 (UserService)
-
@MatiasElorriaga 在通话中添加了编辑 1。
-
请添加RetrofitInitializator代码..我想看看你是否添加杰克逊转换器
-
@MatiasElorriaga,有。
-
我认为您需要在 User 中添加一个构造函数,它将一个字符串作为参数,并将该字符串解析为一个 User 对象。
标签: java android json jackson retrofit