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 implements TypeAdapterFactory {
        @SuppressWarnings("unchecked")
        public  TypeAdapter create(Gson gson, TypeToken type) {
            Class rawType = (Class) type.getRawType();
            if (rawType != String.class) {
                return null;
            }
            return (TypeAdapter) new StringNullAdapter();
        }
    }

    private static class StringNullAdapter extends TypeAdapter {
        @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,转换为""

你可能感兴趣的:(Okhttp请求数据Gson为null的转换)