侧边栏壁纸
  • 累计撰写 372 篇文章
  • 累计创建 60 个标签
  • 累计收到 109 条评论

目 录CONTENT

文章目录

Android Retrofit2 请求时,处理传参请求中的Null数据。

Z同学
2022-03-07 / 0 评论 / 5 点赞 / 576 阅读 / 2,113 字
温馨提示:
本文最后更新于 2022-03-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

我们在封装Retrofit2请求的时候。往往是根据后台的接口定义进行传值。但是有时候却又需要请求字段中需要null

本篇主要介绍下Retrofit2的请求值中如何过滤null,以及如何添加显示null

 @POST("/projects/device/device-groups")
    Call<BasicApiResponse<Group>> getDeviceGroup(@Body Query param);

例如我们创建了一个接口地址,通过Body传递一个自定义的查询类进去。

Retrofit的处理过程中,会将这个实体类转为Json对象。那么它们是哪个地方决定转换Json的呢?

       retrofit = new Retrofit.Builder()
                .client(okHttpBuilder.build())
                .addConverterFactory(GsonConverterFactory.create())  //这一行配置决定的
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(getBaseUrl())
                .build();

当我们在创建retrofit对象的时候,添加了.addConverterFactory(GsonConverterFactory.create()) 那么请求的数据就会被转为Json字段上传了。

我们如果要支持Json解析转换也就是GsonConverterFactory类,那么就需要导入:

implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

json 请求中的null 数据过滤与显示

当我们配置并使用默认的GsonConverterFactory的时候,我们的请求封装类就会在发起请求的时候,被格式化为json字符串并提交。

格式化的就是我们封装类的属性和属性值。但是如果属性为null的情况下。就会被自动过滤掉。

但是我们如果需要这种情况呢?

image-20220307151758787

请求的时候order的值传null 该怎么实现呢?很简单使用GsonBuilder来实现。

public static Gson getGson(){
	GsonBuilder mGsonBuilder = new GsonBuilder();
	mGsonBuilder.serializeNulls();
	return mGsonBuilder.create();
}

然后在retrofit类的初始化中添加为该Gson

 retrofit = new Retrofit.Builder()
                .client(okHttpBuilder.build())
         .addConverterFactory(GsonConverterFactory.create(
         getGson()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(getBaseUrl())
                .build();

那么我们如果想同时使用GsonBuilder 又并不想在请求的时候封装null数据请求呢?

很简单,只需要注释掉:mGsonBuilder.serializeNulls(); 就可以了。

GsonBuilder

这个类是用来干什么的?我们一般使用Gson的时候,都是直接new。但是这种情况下我们针对Json转换的定制化需求就没办法满足了。

而GsonBuilder就是让我们可以定制化Json转换的逻辑。

例如序列话的时候,我们需要将json的Key值全部改为大写,我们希望将Date数据序列话的时候统一格式等等。

都可以通过GsonBuilder去实现,常见的方法如下:

  1. setFieldNamingPolicy 设置序列字段的命名策略(UPPER_CAMEL_CASE,UPPER_CAMEL_CASE_WITH_SPACES,LOWER_CASE_WITH_UNDERSCORES,LOWER_CASE_WITH_DASHES)
  2. addDeserializationExclusionStrategy 设置反序列化时字段采用策略ExclusionStrategy,如反序列化时不要某字段,当然可以采用@Expore代替。
  3. excludeFieldsWithoutExposeAnnotation 设置没有@Expore则不序列化和反序列化
  4. addSerializationExclusionStrategy 设置序列化时字段采用策略,如序列化时不要某字段,当然可以采用@Expore代替。
  5. registerTypeAdapter 为某特定对象设置固定的序列和反序列方式,实现JsonSerializer和JsonDeserializer接口
  6. setFieldNamingStrategy 设置字段序列和反序列时名称显示,也可以通过@Serializer代替
  7. setPrettyPrinting 设置gson转换后的字符串为一个比较好看的字符串
  8. setDateFormat 设置默认Date解析时对应的format格式
5

评论区