问题描述
我尝试解析的 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 (将#修改为@)