改装将响应转换为空值
问题描述:
我试图找出为什么我在用改造登录后得到空用户。这是我得到的回应:改装将响应转换为空值
{"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;
}
}
}
而且签到功能是这样的:
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;
}
任何想法我失踪?响应很好,但在此之后,结果对象的所有字段都像我说的那样是空的。
答
这是因为我使用的泛型类型,就像Bhargav所说的那样。它实现了它只是阅读和回答这种形式的方法:
{"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();
}
}
您是否在使用任何Gson构建器? – Nas
如果这就是你的意思,我正在使用GsonConverterFactory。 –
这:改造适配器=新Retrofit.Builder() .baseUrl(Constants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(createClient()) .build(); –