我正在尝试从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);
    }

08-06 20:12