2016-12-06 2 views
0

私はretrofitでログインした後、なぜヌルユーザーになっているのか理解しようとしています。これは私が得ている応答です:Retrofitはヌル値のレスポンスを変換します

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

私はすべてのユーザーフィールドをnullにしています。ここではユーザークラスです:

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; 
} 

アイデアは何ですか?応答は良いですが、その後、私が言ったように、結果のオブジェクトはすべてのフィールドがnullになります。

+0

Gsonビルダーを使用していますか? – Nas

+0

GsonConverterFactoryを使用しています。 –

+0

ここにある:レトロフィットアダプタ=新しいRetrofit.Builder() .baseUrl(Constants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(createClient()) .build(); –

答えて

0

私が使用していたジェネリックタイプTのため、Bhargav氏のように言いました。それが唯一のこの形式で読んで答えた実装された方法:

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

しかし、私の答えは、このフォームにあった:

:私はUserParentクラスので、同様に行った

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

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

関連する問題