Retrofit配合GSON如何在解析时跳过包含空值的无效数据记录
解决方案
你之前的自定义反序列化器仅作用于单个Family对象,Gson反序列化列表时并不会自动丢弃返回null的元素,只会将null值插入列表中,所以需要改为针对List<Family>类型编写自定义反序列化器,在解析整个数组的阶段直接跳过无效项。
步骤1:实现自定义列表反序列化器
class FamilyListDeserializer : JsonDeserializer<List<Family>> { override fun deserialize( json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext? ): List<Family> { val familyList = mutableListOf<Family>() // 校验json是否为数组类型 if (json?.isJsonArray == true) { val jsonArray = json.asJsonArray jsonArray.forEach { element -> if (element.isJsonObject) { val jsonObject = element.asJsonObject // 只保留VALUE不为null的项 if (!jsonObject.get("VALUE").isJsonNull) { val family = Family( jsonObject.get("ID").asInt, jsonObject.get("NAME").asString, jsonObject.get("VALUE").asInt ) familyList.add(family) } } } } return familyList } }
步骤2:注册反序列化器到Gson
构建Gson实例时将上述自定义反序列化器注册到对应类型:
val gson = GsonBuilder() .registerTypeAdapter( object : TypeToken<List<Family>>() {}.type, FamilyListDeserializer() ) .create()
步骤3:将自定义Gson注入Retrofit
构建Retrofit实例时使用自定义Gson创建ConverterFactory:
val retrofit = Retrofit.Builder() .baseUrl(你的接口根地址) .addConverterFactory(GsonConverterFactory.create(gson)) // 其他配置,比如CallAdapter.Factory等 .build()
可选优化点
如果仅希望该反序列化规则作用于getFamilyValues接口,不影响全局其他List<Family>类型的解析,可以搭配Retrofit的自定义Converter或者使用OkHttp拦截器在解析前过滤无效JSON节点,避免全局注册带来的副作用。
内容的提问来源于stack exchange,提问作者andumava
相关产品推荐
相关产品推荐

