相同的字段有两种不同的类型给改造2的Gson转换器带来麻烦

Fig*_*gör 6 android gson retrofit2

这是json架构:

在此输入图像描述

如您所见,rating可以是boolean和object.

我正在使用Retrofit 2和Gson转换器.我该如何为这个模式创建我的模型?

Fig*_*gör 4

我是这样解决这个问题的:

在模型中创建自定义类型适配器并手动解析评级;

public class AccountState {

    //@SerializedName("rated") //NOPE, parse it manually
    private Integer mRated; //also don't name it rated


    public Integer getRated() {
        return mRated;
    }

    public void setRated(Integer rated) {
        this.mRated = rated;
    }


    public static class AccountStateDeserializer implements JsonDeserializer<AccountState> {

        @Override
        public AccountState deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            AccountState accountState = new Gson().fromJson(json, AccountState.class);
            JsonObject jsonObject = json.getAsJsonObject();

            if (jsonObject.has("rated")) {
                JsonElement elem = jsonObject.get("rated");
                if (elem != null && !elem.isJsonNull()) {
                    if(elem.isJsonPrimitive()){
                        accountState.setRated(null);
                    }else{
                        accountState.setRated(elem.getAsJsonObject().get("value").getAsInt());
                    }
                }
            }
            return accountState ;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以在此处使用此自定义适配器创建 gson:

final static Gson gson = new GsonBuilder()
            .registerTypeAdapter(AccountState.class, new AccountState.AccountStateDeserializer())
            .create();
Run Code Online (Sandbox Code Playgroud)

将其添加到改造中,如下所示:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BuildConfig.ENDPOINT)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(okHttpClient)
                .build();
Run Code Online (Sandbox Code Playgroud)

哒哒哒哒哒哒哒哒!