如何通过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
相关产品推荐
相关产品推荐

