我不能使用GSON将JSON转换为类
问题描述:
我在我的项目中使用了Retrofit库。该库使用Gson库来转换来自JSON的数据。我有个问题。我需要转换通用类。我不能使用GSON将JSON转换为类<T>
public class RestResponse<T> {
private RestError error;
private T response;
public RestError getError() {
return error;
}
public void setError(RestError error) {
this.error = error;
}
public T getResponse() {
return response;
}
public void setResponse(T response) {
this.response = response;
}
public static class RestError {
private int code;
private String message;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
}
我这样做如下:
public interface ApiUser {
@Headers({
"ContentType: application/json",
"Accept: */*"
})
@POST("/api/users")
void authUser(@Body User user, Callback<RestResponse<User>> callback);
}
和
public ApiUser getApiUser() {
if (null == apiUser) {
Gson gson = getGson();
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(BuildConfig.ROOT_URL_SKIP)
.setClient(new OkClient(new OkHttpClient()))
.setConverter(new GsonConverter(gson));
builder.setLogLevel(RestAdapter.LogLevel.FULL);
RestAdapter restAdapter = builder.build();
apiUser = restAdapter.create(ApiUser.class);
}
return apiUser;
}
private Gson getGson() {
return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
}
}).create();
}
和
public void authUser(User user) {
RestApiStorage.me().getApiUser().authUser(user, new Callback<RestResponse<User>>() {
@Override
public void success(RestResponse<User> restResponse, Response response) {
Log.d("132", ""+restResponse.getError().getCode());
}
@Override
public void failure(RetrofitError error) {
BusProvider.getInstance().post(new OttoErrorMessage(error.getMessage()));
}
});
}
改造从服务器返回JSON好,但GSON不转换此到物体。
这里是我的JSON字符串:
{
"response": {
"id": 1,
"uuid": "nPUihPzHAqXLDn8EUj6",
"userInfo": {
"id": 1,
"email": "[email protected]",
"firstName": "Jacob",
"lastName": "Dodson",
"facebookId": "139505288080"
},
"session": {
"id": 1,
"session": "aa4hnvVBFk1gLTqEsL7RJEYQ",
"expirationDate": 1425890619898
},
"pushToken": {
"id": 1,
"token": "APA91bHH-UzWYySOqUVK2PnIDBHqFDAzIKRH6s04sGSuc",
"platformCode": 1
}
}
}
和所产生的误差:
03-02 14:43:43.781 23582-23582/com.skip.client.customer E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.skip.client.customer, PID: 23582
java.lang.NullPointerException
at com.skip.client.connector.UserApiConnector$3.success(UserApiConnector.java:67)
at com.skip.client.connector.UserApiConnector$3.success(UserApiConnector.java:63)
at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5748)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(Native Method)
添加用户:
@Table(name = "Users")
public class User extends Model {
@Expose
@Column(name = "uuid")
@SerializedName("uuid")
private String uuid;
@Expose
@Column(name = "userInfo")
@SerializedName("userInfo")
private UserInfo userInfo;
@Expose
@Column(name = "balancedCustomer")
@SerializedName("balancedCustomer")
private BalancedCustomer balancedCustomer;
@Expose
@Column(name = "session")
@SerializedName("session")
private Session session;
@Expose
@Column(name = "accountTypeId")
@SerializedName("accountTypeId")
private Integer accountTypeId;
@Expose
@Column(name = "pushToken")
@SerializedName("pushToken")
private PushToken pushToken;
public User() {
super();
}
public UserInfo getUserInfo() {
return userInfo;
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
public PushToken getPushToken() {
return pushToken;
}
public void setPushToken(PushToken pushToken) {
this.pushToken = pushToken;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getUuid() {
return uuid;
}
public BalancedCustomer getBalancedCustomer() {
return balancedCustomer;
}
public void setBalancedCustomer(BalancedCustomer balancedCustomer) {
this.balancedCustomer = balancedCustomer;
}
public AccountType getAccountType() {
return AccountType.getById(accountTypeId);
}
public void setAccountType(AccountType accountTypeCode) {
this.accountTypeId = accountTypeCode.code();
}
}
答
如果你的反应作出的成功,是restResponse.getError()
返回空?
@Override
public void success(RestResponse<User> restResponse, Response response) {
//Log.d("132", "" + restResponse.getError().getCode());
}
从目前的stacktrace看来,这似乎不是Gson的问题,你可以添加User类的细节吗? – 2015-03-02 09:18:00
我添加用户类 – 2015-03-02 09:43:32