如何在Retrofit中自定义响应体JSON转换?

时间:2014-07-25 19:13:55

标签: android android-networking retrofit

我正在使用Retrofit来实现Rest Client,并且在尝试将响应主体转换为模型对象时遇到了一些麻烦。

我的界面中有以下内容:

@POST("/users")
void createUser(@Body RegisterUserToken token, Callback<User> callback);

我的User课程基本上是一个POJO:

public class User {

    private int id;
    private String username;
    private String email;
    private String language;
    // getters and setters...
}

这就是我使用Rest Client的方式:

restClient.createUser(token, new Callback<User>() {
    @Override
    public void success(User user, Response response) {
        // ...problem is here, with the user object
    }

    @Override
    public void failure(RetrofitError error) {
        // ...
    }
});

我遇到的问题是响应正文未转换为User对象。我很确定问题是服务器正在返回:

{"user":{"id":13,"username":"john","email":"john@gmail.com","language":"eng"}}

而不仅仅是:

{"id":13,"username":"john","email":"john@gmail.com","language":"eng"}

鉴于我无法真正修改服务器代码,如何自定义Retrofit / GSON以正确地将此响应主体转换为我的User对象?

4 个答案:

答案 0 :(得分:8)

像这样更改POJO类:

public static class User {
    UserData user;
}   

public static class UserData {
    private int id;
    private String username;
    private String email;
    private String language;
}

答案 1 :(得分:1)

尝试使用Map<String,User>而非User。要获取实际的User对象,您可以使用地图上的“user”键访问User对象。

例如:

@POST("/users")
void createUser(@Body RegisterUserToken token, Callback<Map<String, User>> callback);
    restClient.createUser(token, new Callback<Map<String, User>>() {
        @Override
        public void success(Map<String, User> map, Response response) {
            User user = map.get("user");
        }

        @Override
        public void failure(RetrofitError error) {
            // ...
        }
    });
}

答案 2 :(得分:0)

GSON无法解析对象,因为你没有获得root(用户)对象......在这里你会找到你的答案https://stackoverflow.com/a/25505032/761668

答案 3 :(得分:0)

您可以使用Volley库进行休息API调用,以便轻松自定义响应。