You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:51:02