【问题标题】:I can not convert JSON to class<T> using GSON我无法使用 GSON 将 JSON 转换为 class<T>
【发布时间】:2015-03-02 08:46:39
【问题描述】:

我在我的项目中使用 Retrofit 库。该库使用 Gson 库从 JSON 转换数据。我有个问题。我需要转换通用类。

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

Retrofit 从服务器返回良好的 JSON,但 Gson 不会将其转换为对象。

这是我的 JSON 字符串:

{
    "response": {
        "id": 1,
        "uuid": "nPUihPzHAqXLDn8EUj6",
        "userInfo": {
            "id": 1,
            "email": "Test@gmail.com",
            "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();
    }
}

【问题讨论】:

  • 从当前的stacktrace看来不是Gson的问题,你能添加User类的细节吗?

标签: java android gson retrofit


【解决方案1】:

如果您的响应成功,restResponse.getError() 是否返回 null ?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多