我不能使用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(); 
    } 
} 
+0

从目前的stacktrace看来,这似乎不是Gson的问题,你可以添加User类的细节吗? – 2015-03-02 09:18:00

+0

我添加用户类 – 2015-03-02 09:43:32

如果你的反应作出的成功,是restResponse.getError()返回空?

@Override 
public void success(RestResponse<User> restResponse, Response response) { 
    //Log.d("132", "" + restResponse.getError().getCode()); 
}