Okhttp请求数据Gson为null的转换

在第一次注册并登陆的时候,服务端会返回用户的信息。如果没有默认值或返回的数据为null时,我们使用GsonConverterFactory转换器就会报空指针异常。以下方法针对返回的是String的数据做一次转换。

一个普通的Service创建

 private static Retrofit userService = null;
    public static UserService userApi() {
        if (userService == null) {
            Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
            userService = new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .client(mOkHttpClient)
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();
        }
        return userService.create(UserService.class);
    }
   private static class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory {
        @SuppressWarnings("unchecked")
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            Class<T> rawType = (Class<T>) type.getRawType();
            if (rawType != String.class) {
                return null;
            }
            return (TypeAdapter<T>) new StringNullAdapter();
        }
    }

    private static class StringNullAdapter extends TypeAdapter<String> {
        @Override
        public String read(JsonReader reader) throws IOException {
            if (reader.peek() == JsonToken.NULL) {
                reader.nextNull();
                return "";
            }
            return reader.nextString();
        }

        @Override
        public void write(JsonWriter writer, String value) throws IOException {
            if (value == null) {
                writer.nullValue();
                return;
            }
            writer.value(value);
        }
    }

这样就把model属性值为nullString,转换为""

    原文作者:倔强的炉包
    原文地址: https://www.jianshu.com/p/a4fda2c4d2ca
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞