【问题标题】:How to use Retrofit2 + GSON -> Class with custom object?如何使用 Retrofit2 + GSON -> 自定义对象的类?
【发布时间】:2016-06-14 10:52:02
【问题描述】:

我正在阅读 stackoverflow 中的另一篇文章,但无法正常工作。

我有一个服务器返回的数据,格式如下:

服务器响应

{
  "userData": {
    "username": "victor.javier",
    "email": "victor.javier@stackoverflow.com",
    "createdAt": "2016-05-11T09:55:14.720Z",
    "updatedAt": "2016-05-11T09:55:14.720Z",
    "id": "5733018274ddfad25"
  },
  "token": "SkpaNuXdzfrhiH06qGK93EH2ujM37hfk02F8o2EodYJumG"
}

我的代码 POJO 是下一个:

User.class

public class User {

    @SerializedName("userData")
    @Expose
    private UserData userData;

    @SerializedName("token")
    @Expose
    private String token;

    ... CONSTRUCTOR AND GETTERS/SETTERS

}

UserData.class

public class UserData {

    @SerializedName("username")
    @Expose
    private String username;

    @SerializedName("email")
    @Expose
    private String email;

    @SerializedName("createdAt")
    @Expose
    private String createdAt;

    @SerializedName("updatedAt")
    @Expose
    private String updatedAt;

    @SerializedName("id")
    @Expose
    private String id;

    ... CONSTRUCTOR AND GETTERS/SETTERS

}

我从另一篇文章中复制了下一节课以反序列化 GSON。代码是:

RestDeserializer.class

public class RestDeserializer<T> implements JsonDeserializer<T> {

    private Class<T> mClass;
    private String mKey;

    public RestDeserializer(Class<T> targetClass, String key) {
        mClass = targetClass;
        mKey = key;
    }

    @Override
    public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
            throws JsonParseException {
        JsonElement content = je.getAsJsonObject().get(mKey);
        return new Gson().fromJson(content, mClass);

    }
}

改造实施是:

RetroFitImpl

public class UserApiImpl implements UserApi {

    @Inject
    public UserApiImpl() { }

    @Override
    public User loginUser(String identifier, String password) {
        Retrofit retrofitBuilder = getRetrofitBuilder();
        UserRetrofitApi userRetrofitApi = retrofitBuilder.create(UserRetrofitApi.class);

        LoginRequestEntity loginRequestEntity = new LoginRequestEntity();
        loginRequestEntity.setIdentifier(identifier);
        loginRequestEntity.setPassword(password);

        Call<User> call = userRetrofitApi.loginUser(loginRequestEntity);
        Response<User> response = null;
        try {
            response = call.execute();
        } catch (IOException e) {
            e.printStackTrace();
        }

        User body = null;
        if (response != null) {
            body = response.body();
        }
        return body;
    }

    private Retrofit getRetrofitBuilder() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        return new Retrofit.Builder()
                .baseUrl(BuildConfig.API_URL)
                .client(client)
                .addConverterFactory(buildGsonConverter())
                .build();
    }

    private static GsonConverterFactory buildGsonConverter() {
        GsonBuilder gsonBuilder = new GsonBuilder();

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(User.class, new RestDeserializer<>(User.class, "userData"))
                .create();

        return GsonConverterFactory.create(gson);
    }
}

我在 buildGsonConverter 方法上做错了,因为我每次都会收到 onError 的改造调用,所以我认为这是 GSON 构建中的问题。

谁能告诉我如何解析这个来构造一个像服务器响应一样的 GSON?

谢谢。

【问题讨论】:

    标签: android gson retrofit2 custom-object nest-nested-object


    【解决方案1】:

    查看改造文档中的示例

    http://square.github.io/retrofit/

    你不需要创建自己的 gson 工厂

    .addConverterFactory(GsonConverterFactory.create())
    

    并且还添加到 build.gradle

    com.squareup.retrofit2:converter-gson
    

    【讨论】:

    • 我已删除该行,但这不是解决方案。 :(。谢谢保罗
    • 你不必删除你的行,你需要像例子中那样使用gson转换器工厂!
    【解决方案2】:

    您无需自己创建 pojo。您可以使用http://jsonschema2pojo.com 创建一个 pojo US ng yur 服务器响应。

    【讨论】:

    • 我的 pojos 似乎没问题,Prasheel。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多