介绍
我们在封装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
的情况下。就会被自动过滤掉。
但是我们如果需要这种情况呢?
请求的时候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去实现,常见的方法如下:
- setFieldNamingPolicy 设置序列字段的命名策略(UPPER_CAMEL_CASE,UPPER_CAMEL_CASE_WITH_SPACES,LOWER_CASE_WITH_UNDERSCORES,LOWER_CASE_WITH_DASHES)
- addDeserializationExclusionStrategy 设置反序列化时字段采用策略ExclusionStrategy,如反序列化时不要某字段,当然可以采用@Expore代替。
- excludeFieldsWithoutExposeAnnotation 设置没有@Expore则不序列化和反序列化
- addSerializationExclusionStrategy 设置序列化时字段采用策略,如序列化时不要某字段,当然可以采用@Expore代替。
- registerTypeAdapter 为某特定对象设置固定的序列和反序列方式,实现JsonSerializer和JsonDeserializer接口
- setFieldNamingStrategy 设置字段序列和反序列时名称显示,也可以通过@Serializer代替
- setPrettyPrinting 设置gson转换后的字符串为一个比较好看的字符串
- setDateFormat 设置默认Date解析时对应的format格式
评论区