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

如何通过Gson的Component类型JsonDeserializer过滤数组中DEFAULT元素

问题与解答

示例JSON对象

{
    id: 10,
    name: "Hello World",
    components: [
        {
            id: 1,
            type: "FRAME"
        },
        {
            id: 2,
            type: "DEFAULT"
        }
    ]
}

Component对象的JsonDeserializer实现

class ComponentDeserializer : JsonDeserializer<Component> {
    override fun deserialize(
        json: JsonElement,
        typeOfT: Type,
        context: JsonDeserializationContext
    ): Component {
        val componentObject = json.asJsonObject
        
        val id = componentObject.get("id").asInt
        val type = componentObject.get("type").asString
        
        return Component(
            id = id,
            type = type
        )
    }
}

问题

能否不编写整个JSON的反序列化器,仅通过该ComponentDeserializer排除type为"DEFAULT"的组件,例如返回null使components数组元素减少一个?

解答

单靠这个ComponentDeserializer没法直接实现过滤——当处理数组时,Gson(从代码看你用的是Gson的反序列化框架)会逐个调用元素的反序列化器,要是你返回null,Gson只会把这个null留在数组里,不会自动删掉它。

想过滤掉type为"DEFAULT"的组件,有几个更可行的办法:

  • 反序列化后手动过滤:把整个JSON反序列化完之后,直接对components数组做过滤,删掉type是"DEFAULT"的元素,这种方式最简单直接。
  • 给List写专属反序列化器:不用写整个对象的反序列化器,只针对组件列表类型写一个,遍历每个组件的JSON节点,判断type符合要求再反序列化加入结果列表。
  • 搭配TypeAdapterFactory:通过工厂类拦截数组的反序列化流程,结合ComponentDeserializer的判断逻辑过滤元素,但这种方式相对复杂些。

总之,只靠单个ComponentDeserializer返回null达不到自动从数组中移除元素的效果,得配合其他处理逻辑才行。

内容的提问来源于stack exchange,提问作者TheFlashes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:58