【问题标题】:How to customize the response body JSON conversion in Retrofit?如何在 Retrofit 中自定义响应体 JSON 转换?
【发布时间】:2014-07-25 19:13:55
【问题描述】:

我正在使用 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 以将此响应正文正确转换为我的用户对象?

【问题讨论】:

  • 打印出来的数据是什么样子的?
  • 我只是得到一个空的用户对象(这个对象的所有字段都初始化为其默认值)。
  • 不使用用户对象,而是使用字符串并将其打印出来。这样你可以找出问题是在你端还是在服务器端
  • 如果您不知道如何将其打印为字符串,请参阅此答案stackoverflow.com/a/24964462/1167780
  • 谢谢,但我想避免在响应回调中手动处理 GSON,但我想我真的别无选择,对吧?哈

标签: android android-networking retrofit


【解决方案1】:

像这样更改 POJO 类:

public static class User {
    UserData user;
}   

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

【讨论】:

    【解决方案2】:

    尝试使用Map&lt;String,User&gt; 而不仅仅是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) {
                // ...
            }
        });
    }
    

    【讨论】:

    • 欢迎来到 SO。通常提供示例代码可以帮助提出问题的人更快地实施您提出的示例。
    • 嘿@hyp3rs0nik 看来您可能走在正确的轨道上。你能提供示例代码吗?谢谢!
    • 最好使用带有User user 字段的UserResponse 对象。
    • 是的,我想这会奏效。我不太喜欢将元数据添加到我的模型对象中,但将其命名为 UserResponse 我想这是包装 User 对象而不添加此元数据的好方法。谢谢。
    【解决方案3】:

    GSON 无法解析对象,因为您没有获取根(用户)对象...在这里您将找到答案https://stackoverflow.com/a/25505032/761668

    【讨论】:

      【解决方案4】:

      您可以将 Volley 库用于其他 API 调用,您可以在其中轻松自定义响应。

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 1970-01-01
        • 2016-05-31
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多