【问题标题】:Object become null when converted to json转换为 json 时对象变为空
【发布时间】:2016-06-21 21:36:41
【问题描述】:

这是问题所在,当我使用改造将我的对象发送到服务器时,我得到它为空。我这样做是为了创建 json 对象:

HashMap<String, UserModel> map = new HashMap<>();
map.put("user", user);

但是,当 json 到达服务器时,我得到了这样的结果:

{"user":null}

然后我用这一行打印了 ny json 文件:

Log.d("TAG", new JSONObject(map).toString());

我看到了同样的空对象。

所以,这是我的问题,为什么会这样?我该如何解决这个问题?

这里有一些关于我的项目的信息:

Retrofit version: 2.0.0
Retrofit serializer: jackson version 2.0.0
using also jackson to convert JodaTime version 2.4.0

我是如何获得改造实例的:

public T buildServiceInstance(Class<T> clazz){
        return new Retrofit.Builder().baseUrl(BuildConfig.API_HOST)
                                     .addConverterFactory(JacksonConverterFactory.create())
                                     .build().create(clazz);
    }

我在这里调用该方法:

public static final IUserApi serviceInstance = new ApiBuildRequester<IUserApi>()
                                                                .buildServiceInstance(IUserApi.class);

接口IUserApi上的方法声明:

@POST("User.svc/Save")
Call<ResponseSaveUserApiModel> save(@Body HashMap<String, UserModel> map);

最后,但我想,同样重要:

public class UserModel implements Parcelable {


    private String idUser;
    private String name;
    private String email;
    @JsonProperty("password")
    private String safePassword;
    private String salt;
    private String phoneNumber;
    private String facebookProfilePictureUrl;
    private String facebookUserId;

    public UserModel() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIdUser() {
        return idUser;
    }

    public void setIdUser(String idUser) {
        this.idUser = idUser;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSafePassword() {
        return safePassword;
    }

    public void setSafePassword(String safePassword) {
        this.safePassword = safePassword;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getFacebookProfilePictureUrl() {
        return facebookProfilePictureUrl;
    }

    public void setFacebookProfilePictureUrl(String facebookProfilePictureUrl) {
        this.facebookProfilePictureUrl = facebookProfilePictureUrl;
    }

    public String getFacebookUserId() {
        return facebookUserId;
    }

    public void setFacebookUserId(String facebookUserId) {
        this.facebookUserId = facebookUserId;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public UserModel(Parcel in) { // Deve estar na mesma ordem do "writeToParcel"
        setIdUser(in.readString());
        setName(in.readString());
        setEmail(in.readString());
        setSafePassword(in.readString());
        setPhoneNumber(in.readString());
        setFacebookProfilePictureUrl(in.readString());
        setFacebookUserId(in.readString());
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) { //Deve estar na mesma ordem do construtor que recebe parcel
        dest.writeString(idUser);
        dest.writeString(name);
        dest.writeString(email);
        dest.writeString(safePassword);
        dest.writeString(phoneNumber);
        dest.writeString(facebookProfilePictureUrl);
        dest.writeString(facebookUserId);
    }

    public static final Parcelable.Creator<UserModel> CREATOR = new Parcelable.Creator<UserModel>(){
        @Override
        public UserModel createFromParcel(Parcel source) {
            return new UserModel(source);
        }

        @Override
        public UserModel[] newArray(int size) {
            return new UserModel[size];
        }
    };

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }
}

调试屏幕:

【问题讨论】:

  • 您确定您的用户对象在序列化时不为空吗?
  • @MikhailChibel 是的,我已经调试过了,看截图
  • org.json (JSONObject) 没有映射器 API。它无法将您的 pojo 转换为 json。阅读包装文档!
  • 是的,您可能想使用 Jackson 反序列化来检查您的地图,而不是 new JSONObject(map).toString()

标签: java android json retrofit


【解决方案1】:

@Selvin 和 @cricket_007 你是最棒的!

我得到了这个提示,我的打印错误,我找到了解决方案。 我的应用程序中有两种类型的用户,facebook 用户或本地用户,两种形式,但只有一个对象,这就是问题所在,当我发送 facebook 对象(完整)时它工作正常,但是当我尝试发送带有一些空属性的本地用户,它使我的序列化崩溃。

所以我必须在发送之前检查每个属性,这只是一种解决方法,但现在已经足够了,谢谢大家!

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多