Retrofit / Jackson在反序列化方面的错误

时间:2017-07-20 17:43:22

标签: java android json jackson retrofit

我试图从我的网络服务获取JSON并反序列化到我的类UserSync,但我收到以下错误:

无法从字符串值('')实例化类型[simple type,class com.example.breno.teste.model.User]的值。没有单字符串构造函数/工厂方法                                                                                在[来源:okhttp3.ResponseBody$BomAwareReader@fbf814f; line:1,column:86](通过引用链:com.example.breno.teste.dto.UserSync [" user"])

我已经阅读了一些帖子,说我需要在UserSync中声明我的User类是静态的,但是当我这样做时,即使使用JsonDescription,jackson也找不到任何用户属性。另一篇帖子说我可能需要声明一个默认构造函数,所以我做了。

这是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());
            }
        };
    }

编辑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);
    }
}

1 个答案:

答案 0 :(得分:0)

我设法解决了将User类型切换为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);
    }