改装将响应转换为空值(Retrofit converts response with null values)

编程入门 行业动态 更新时间:2024-10-25 07:34:14
改装将响应转换为空值(Retrofit converts response with null values)

我试图找出为什么我在用改造登录后得到一个空用户。 这是我得到的回应:

{"status":{"code":0,"message":"Ok."},"result":{"user":{"id":29366,"first_name":"Pinch","last_name":"oijoiji","alias_exists":true}}}

但改造后解析它,我得到所有的用户字段为空。 这里是用户类:

import android.os.Parcel; import android.os.Parcelable; import com.google.gson.annotations.SerializedName; public class User implements Parcelable { public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int i) { return new User[i]; } }; @SerializedName("id") private String mId; @SerializedName("first_name") private String mFirstName; @SerializedName("last_name") private String mLastName; @SerializedName("login") private String mEmailAddress; @SerializedName("msisdn") private String mPhoneNumber; @SerializedName("plate") private String mCarRegistrationNumber; private String mLanguageCode; private String mCountryCode; @SerializedName("alias_exists") private boolean mHasBankingInformation; public User() { } public User(Parcel parcel) { mId = parcel.readString(); mFirstName = parcel.readString(); mLastName = parcel.readString(); mEmailAddress = parcel.readString(); mPhoneNumber = parcel.readString(); mCarRegistrationNumber = parcel.readString(); mLanguageCode = parcel.readString(); mCountryCode = parcel.readString(); mHasBankingInformation = parcel.readByte() == 1; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(mId); parcel.writeString(mFirstName); parcel.writeString(mLastName); parcel.writeString(mEmailAddress); parcel.writeString(mPhoneNumber); parcel.writeString(mCarRegistrationNumber); parcel.writeString(mLanguageCode); parcel.writeString(mCountryCode); parcel.writeByte((byte) (mHasBankingInformation ? 1 : 0)); } // Basic methods @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof User)) { return false; } User user = (User) o; return mId.equals(user.mId); } @Override public int hashCode() { return mId.hashCode(); } // Accessors /** * This mId can be used to uniquely identify the user on remote servers. * * @return User's unique mId. */ public String getId() { return mId; } public void setId(String id) { this.mId = id; } /** * @return User's first name. */ public String getFirstName() { return mFirstName; } public void setFirstName(String firstName) { this.mFirstName = firstName; } /** * @return User's last name. */ public String getLastName() { return mLastName; } public void setLastName(String lastName) { this.mLastName = lastName; } /** * @return User's email address. */ public String getEmailAddress() { return mEmailAddress; } public void setEmailAddress(String emailAddress) { this.mEmailAddress = emailAddress; } /** * @return User's mobile phone number. */ public String getPhoneNumber() { return mPhoneNumber; } public void setPhoneNumber(String phoneNumber) { this.mPhoneNumber = phoneNumber; } /** * @return User's car registration number (vehicle plat). */ public String getCarRegistrationNumber() { return mCarRegistrationNumber; } public void setCarRegistrationNumber(String carRegistrationNumber) { this.mCarRegistrationNumber = carRegistrationNumber; } /** * @return User's preferred language ISO code. */ public String getLanguageCode() { return mLanguageCode; } public void setLanguageCode(String languageCode) { this.mLanguageCode = languageCode; } /** * @return User's country ISO code. */ public String getCountryCode() { return mCountryCode; } public void setCountryCode(String countryCode) { this.mCountryCode = countryCode; } /** * @return Whether the user has defined banking information (credit card) for his account. */ public boolean getHasBankingInformation() { return mHasBankingInformation; } public void setHasBankingInformation(boolean hasBankingInformation) { this.mHasBankingInformation = hasBankingInformation; } @Override public String toString() { final StringBuilder sb = new StringBuilder("User{"); sb.append("mId='").append(mId).append('\''); sb.append(", mFirstName='").append(mFirstName).append('\''); sb.append(", mLastName='").append(mLastName).append('\''); sb.append(", mEmailAddress='").append(mEmailAddress).append('\''); sb.append(", mPhoneNumber='").append(mPhoneNumber).append('\''); sb.append(", mCarRegistrationNumber='").append(mCarRegistrationNumber).append('\''); sb.append(", mLanguageCode='").append(mLanguageCode).append('\''); sb.append(", mCountryCode='").append(mCountryCode).append('\''); sb.append(", mHasBankingInformation=").append(mHasBankingInformation); sb.append('}'); return sb.toString(); }

}

这里是LoginResponse类:

public class LoginResponse extends WebServiceResponse<User> { @Override public void setResult(User result) { super.setResult(result); }

}

和WebServiceResponse类:

public abstract class WebServiceResponse<T> { // =============================================================================== // Member variables // =============================================================================== @SerializedName("status") private Status mStatus; @SerializedName("result") private T mResult; // =============================================================================== // Utility methods // =============================================================================== @Override public String toString() { return "WebServiceResponse{" + "mStatus=" + mStatus + ", mResult=" + mResult + '}'; } /** * @return Whether the response is valid, based on its status code. */ public boolean isValid() { // TODO: Use a custom Error class return mStatus != null && mStatus.getCode() == 0; } // =============================================================================== // Accessors // =============================================================================== public Status getStatus() { return mStatus; } public void setStatus(Status status) { mStatus = status; } public T getResult() { return mResult; } public void setResult(T result) { mResult = result; } public static class Status { // =============================================================================== // Member variables // =============================================================================== @SerializedName("code") private int mCode; @SerializedName("message") private String mMessage; // =============================================================================== // Utility methods // =============================================================================== @Override public String toString() { return "Status{" + "mCode=" + mCode + ", mMessage='" + mMessage + '\'' + '}'; } // =============================================================================== // Accessors // =============================================================================== public int getCode() { return mCode; } public void setCode(int code) { mCode = code; } public String getMessage() { return mMessage; } public void setMessage(String message) { mMessage = message; } } }

signIn函数是这样的:

public Call<LoginResponse> signIn(final String username, final String password, final ConnectionCallback callback) { Call<LoginResponse> call = WebServiceHelper2.getInstance().signIn(username, password); call.enqueue(new Callback<LoginResponse>() { @Override public void onResponse(Response<LoginResponse> response, Retrofit retrofit) { if (response.isSuccess()) { if (response.body().isValid()) { storeSession(username, password); notifySessionStateChange(true); if (callback != null) { callback.onSuccess(response.body().getResult()); } } else { callback.onError(response.body().getStatus().getCode()); } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }); return call; }

任何想法我失踪? 响应很好,但在此之后,结果对象的所有字段都像我说的那样是空的。

I'm trying to figure out why I'm getting a null User after logging in with retrofit. This is the response I'm getting:

{"status":{"code":0,"message":"Ok."},"result":{"user":{"id":29366,"first_name":"Pinch","last_name":"oijoiji","alias_exists":true}}}

But after retrofit parses it I'm getting all the user fields null. Here's the user class:

import android.os.Parcel; import android.os.Parcelable; import com.google.gson.annotations.SerializedName; public class User implements Parcelable { public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int i) { return new User[i]; } }; @SerializedName("id") private String mId; @SerializedName("first_name") private String mFirstName; @SerializedName("last_name") private String mLastName; @SerializedName("login") private String mEmailAddress; @SerializedName("msisdn") private String mPhoneNumber; @SerializedName("plate") private String mCarRegistrationNumber; private String mLanguageCode; private String mCountryCode; @SerializedName("alias_exists") private boolean mHasBankingInformation; public User() { } public User(Parcel parcel) { mId = parcel.readString(); mFirstName = parcel.readString(); mLastName = parcel.readString(); mEmailAddress = parcel.readString(); mPhoneNumber = parcel.readString(); mCarRegistrationNumber = parcel.readString(); mLanguageCode = parcel.readString(); mCountryCode = parcel.readString(); mHasBankingInformation = parcel.readByte() == 1; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(mId); parcel.writeString(mFirstName); parcel.writeString(mLastName); parcel.writeString(mEmailAddress); parcel.writeString(mPhoneNumber); parcel.writeString(mCarRegistrationNumber); parcel.writeString(mLanguageCode); parcel.writeString(mCountryCode); parcel.writeByte((byte) (mHasBankingInformation ? 1 : 0)); } // Basic methods @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof User)) { return false; } User user = (User) o; return mId.equals(user.mId); } @Override public int hashCode() { return mId.hashCode(); } // Accessors /** * This mId can be used to uniquely identify the user on remote servers. * * @return User's unique mId. */ public String getId() { return mId; } public void setId(String id) { this.mId = id; } /** * @return User's first name. */ public String getFirstName() { return mFirstName; } public void setFirstName(String firstName) { this.mFirstName = firstName; } /** * @return User's last name. */ public String getLastName() { return mLastName; } public void setLastName(String lastName) { this.mLastName = lastName; } /** * @return User's email address. */ public String getEmailAddress() { return mEmailAddress; } public void setEmailAddress(String emailAddress) { this.mEmailAddress = emailAddress; } /** * @return User's mobile phone number. */ public String getPhoneNumber() { return mPhoneNumber; } public void setPhoneNumber(String phoneNumber) { this.mPhoneNumber = phoneNumber; } /** * @return User's car registration number (vehicle plat). */ public String getCarRegistrationNumber() { return mCarRegistrationNumber; } public void setCarRegistrationNumber(String carRegistrationNumber) { this.mCarRegistrationNumber = carRegistrationNumber; } /** * @return User's preferred language ISO code. */ public String getLanguageCode() { return mLanguageCode; } public void setLanguageCode(String languageCode) { this.mLanguageCode = languageCode; } /** * @return User's country ISO code. */ public String getCountryCode() { return mCountryCode; } public void setCountryCode(String countryCode) { this.mCountryCode = countryCode; } /** * @return Whether the user has defined banking information (credit card) for his account. */ public boolean getHasBankingInformation() { return mHasBankingInformation; } public void setHasBankingInformation(boolean hasBankingInformation) { this.mHasBankingInformation = hasBankingInformation; } @Override public String toString() { final StringBuilder sb = new StringBuilder("User{"); sb.append("mId='").append(mId).append('\''); sb.append(", mFirstName='").append(mFirstName).append('\''); sb.append(", mLastName='").append(mLastName).append('\''); sb.append(", mEmailAddress='").append(mEmailAddress).append('\''); sb.append(", mPhoneNumber='").append(mPhoneNumber).append('\''); sb.append(", mCarRegistrationNumber='").append(mCarRegistrationNumber).append('\''); sb.append(", mLanguageCode='").append(mLanguageCode).append('\''); sb.append(", mCountryCode='").append(mCountryCode).append('\''); sb.append(", mHasBankingInformation=").append(mHasBankingInformation); sb.append('}'); return sb.toString(); }

}

And here's the LoginResponse class:

public class LoginResponse extends WebServiceResponse<User> { @Override public void setResult(User result) { super.setResult(result); }

}

And the WebServiceResponse class:

public abstract class WebServiceResponse<T> { // =============================================================================== // Member variables // =============================================================================== @SerializedName("status") private Status mStatus; @SerializedName("result") private T mResult; // =============================================================================== // Utility methods // =============================================================================== @Override public String toString() { return "WebServiceResponse{" + "mStatus=" + mStatus + ", mResult=" + mResult + '}'; } /** * @return Whether the response is valid, based on its status code. */ public boolean isValid() { // TODO: Use a custom Error class return mStatus != null && mStatus.getCode() == 0; } // =============================================================================== // Accessors // =============================================================================== public Status getStatus() { return mStatus; } public void setStatus(Status status) { mStatus = status; } public T getResult() { return mResult; } public void setResult(T result) { mResult = result; } public static class Status { // =============================================================================== // Member variables // =============================================================================== @SerializedName("code") private int mCode; @SerializedName("message") private String mMessage; // =============================================================================== // Utility methods // =============================================================================== @Override public String toString() { return "Status{" + "mCode=" + mCode + ", mMessage='" + mMessage + '\'' + '}'; } // =============================================================================== // Accessors // =============================================================================== public int getCode() { return mCode; } public void setCode(int code) { mCode = code; } public String getMessage() { return mMessage; } public void setMessage(String message) { mMessage = message; } } }

And the signIn function is this:

public Call<LoginResponse> signIn(final String username, final String password, final ConnectionCallback callback) { Call<LoginResponse> call = WebServiceHelper2.getInstance().signIn(username, password); call.enqueue(new Callback<LoginResponse>() { @Override public void onResponse(Response<LoginResponse> response, Retrofit retrofit) { if (response.isSuccess()) { if (response.body().isValid()) { storeSession(username, password); notifySessionStateChange(true); if (callback != null) { callback.onSuccess(response.body().getResult()); } } else { callback.onError(response.body().getStatus().getCode()); } } } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }); return call; }

Any ideas what I'm missing? The response is good but after that the resulted object has all the fields null like I said.

最满意答案

正如Bhargav所说,这是因为TI使用的通用类型。 它的实施方式只是以这种形式阅读和回答:

{"status":{"code":0,"message":"Ok."},"result":{"id":29367,"first_name":"Pinch","last_name":"Test2","alias_exists":true}}

但我的回答是这样的:

{"status":{"code":0,"message":"Ok."},"result":{"user":{"id":29367,"first_name":"Pinch","last_name":"Test2","alias_exists":true}}}

我做了一个UserParent类,如下所示:

public class UserParent implements Parcelable { @SerializedName("user") private User user; protected UserParent(Parcel in) { user = in.readParcelable(User.class.getClassLoader()); } public static final Creator<UserParent> CREATOR = new Creator<UserParent>() { @Override public UserParent createFromParcel(Parcel in) { return new UserParent(in); } @Override public UserParent[] newArray(int size) { return new UserParent[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(user, flags); } public User getChild() { return user; }

}

我这样实现它:

public class LoginResponse extends WebServiceResponse<UserParent> { @Override public void setResult(UserParent result) { super.setResult(result); } @Override public UserParent getResult() { return super.getResult(); }

}

It was because of the generic type T I was using, like Bhargav said. The way it was implemented it was only reading and answer in this form:

{"status":{"code":0,"message":"Ok."},"result":{"id":29367,"first_name":"Pinch","last_name":"Test2","alias_exists":true}}

But my answer was in this form:

{"status":{"code":0,"message":"Ok."},"result":{"user":{"id":29367,"first_name":"Pinch","last_name":"Test2","alias_exists":true}}}

I've made a UserParent class like so:

public class UserParent implements Parcelable { @SerializedName("user") private User user; protected UserParent(Parcel in) { user = in.readParcelable(User.class.getClassLoader()); } public static final Creator<UserParent> CREATOR = new Creator<UserParent>() { @Override public UserParent createFromParcel(Parcel in) { return new UserParent(in); } @Override public UserParent[] newArray(int size) { return new UserParent[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(user, flags); } public User getChild() { return user; }

}

And I implemented it like this:

public class LoginResponse extends WebServiceResponse<UserParent> { @Override public void setResult(UserParent result) { super.setResult(result); } @Override public UserParent getResult() { return super.getResult(); }

}

更多推荐

本文发布于:2023-07-30 06:35:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1336719.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:为空   Retrofit   converts   values   null

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!