我正在尝试从Web服务获取JSON并将其反序列化到我的类UserSync,但出现以下错误:
无法从字符串值('')实例化类型[简单类型,类com.example.breno.teste.model.User]的值;没有单字符串构造函数/工厂方法
在[来源:okhttp3.ResponseBody$BomAwareReader@fbf814f;行:1,列:86](通过参考链:com.example.breno.teste.dto.UserSync [“ user”])
我读过一些文章说我需要在UserSync中将User类声明为静态,但是当我这样做时,即使使用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": "[email protected]",
"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());
}
};
}
编辑2-retrofitInicializator类:
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);
}
}
最佳答案
我设法解决了将用户类型切换为JsonNode并在此之后进行转换的问题。
@JsonProperty("status")
private String Status;
@JsonProperty("currentDate")
private String CurrentDate;
@JsonProperty("message")
private String Message;
@JsonProperty("user")
private JsonNode NewUser;
和转换:
private User getUserFromUserAsync(UserSync userSync) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.treeToValue(userSync.getNewUser(), User.class);
}