kotlin 中的通用类杰克逊反序列化器

问题描述

我尝试解析的 JSON 格式如下

"response": {
    "collection": {
        "big-uuid": {
               "name": "some value","age": "some value","etc": "some value",},"another-big-uuid": ...
    }
}

进入这个数据类:

data class Response(
    @JsonProperty("collection")
    @JsonDeserialize(contentUsing = customDeserializer::class)
    val collection: Map<String,CollectionData>
)

data class CollectionData(
    val id: String,@JsonProperty("name")
    val name: String,@JsonProperty("etc")
    val etc: String
)

我想在字典中以及 id 变量中包含“big-uuid”。我使用以下自定义解串器实现了这一点:

class customDeserializer: JsonDeserializer<CollectionData>(){
    override fun deserialize(p: JsonParser?,ctxt: DeserializationContext?): CollectionData {
        val coll_id: String? = ctxt?.parser?.currentName
        val collData: CollectionData = p!!.readValueAs(CollectionData::class.java)
        collData.id = coll_id
        return collData
    }
}

直到这个阶段,代码都可以工作,但是这种在地图值中包含 uuid 的模式在 JSON 响应的很多地方重复。我不想为每个不同的类制作相同的反序列化器,而是想制作一个通用的反序列化器,我可以在其中传递通用类并获取相应的类对象作为输出

这是我到目前为止所拥有的,但是我不确定如何使用 jackson 注释将类传递给自定义反序列化器。

class deserializeMapKeyToval<T>: JsonDeserializer<T>(){
    override fun deserialize(p: JsonParser?,ctxt: DeserializationContext?): T {
        val map_id: String? = ctxt?.parser?.currentName
        val map_value: T = p!!.readValueAsTree()
        if (map_value is CollectionData){
            map_value.id = map_id
        }
        return map_value
    }
}

MainActivity 代码供参考:


...

val mapper = jacksonObjectMapper()
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
val response: Response = mapper.readValue(json)

...

当前通用反序列化器的错误

Caused by: java.lang.classCastException: com.fasterxml.jackson.databind.node.ObjectNode cannot be cast to <package dir>.CollectionData

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)