提问人:k.meinkopf 提问时间:10/26/2023 最后编辑:k.meinkopf 更新时间:10/27/2023 访问量:56
为什么 Jackson 不解析使用相同的 ObjectMapper 序列化的 JSON?
Why does Jackson not parse a JSON serialized with the same ObjectMapper?
问:
我正在尝试序列化一些具有大量嵌套属性的大对象(其中很多是多态的)。 就目前而言,我在尝试序列化基本上是空占位符的对象时遇到了一个问题:
class EmptyTagHolder<T> : TagHolder<T> {
override fun contains(tag: T) = false
override fun plus(other: TagHolder<T>) = other
override fun plus(other: T) = TagSet(other)
override fun iterator() = emptyList<T>().iterator()
}
这是:TagHolder
interface TagHolder<TagType> : Iterable<TagType> {
operator fun contains(tag: TagType): Boolean
operator fun plus(other: TagHolder<TagType>): TagHolder<TagType>
operator fun plus(other: TagType): TagHolder<TagType>
}
可以有其他的实现,这里实际上提到了一个,.但关键是,杰克逊序列化了这样的实例:TagHolder
TagSet
EmptyTagHolder
{
"[package].EmptyTagHolder": [ ]
}
我需要在 Redis 中存储我提到的那个大对象,它基本上是一个编辑器状态,从实际数据库中提取成本很高,因此它作为缓存存储在 Redis 中。
当涉及到反序列化该对象时,Jackson 在这件事上失败了,并出现以下错误:EmptyTagHolder
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `[package].EmptyTagHolder<[package].EntityTag>` from Array value (token `JsonToken.START_ARRAY`)
所以问题是:我如何让杰克逊实际消耗它之前产生的字节?
更新:
包含以下属性的类:TagHolder
interface Entity {
val id: SourceAwareIdentifier
val type: EntityType
val tags: TagHolder<EntityTag>
val adjacencyTags: TagHolder<EntityTag>
val properties: PropertyStore
}
UPD2: 实际类实现:
data class LocalEntity(
override val id: SourceAwareIdentifier,
override val type: EntityType,
override val tags: TagHolder<EntityTag>,
override val adjacencyTags: TagHolder<EntityTag>,
override val properties: EditablePropertyStore,
) : Entity
我得到的 json 作为序列化结果:
{
"entity": {
"somepackage.data.network.local.model.entity.LocalEntity": {
"label": "Test",
"id": {
"somepackage.data.network.model.id.impl.RawSourceAwareIdentifier": {
"source": "local",
"internalId": "local:57fc8745-706e-4159-847f-7a35182d330f"
}
},
"type": {
"somepackage.data.network.model.entity.EntityType": "Regular"
},
"tags": {
"somepackage.data.generic.impl.TagSet": {
"tags": {
"java.util.Collections$SingletonSet": [
{
"somepackage.data.network.model.entity.EntityTag": "Lorem"
}
]
}
}
},
"adjacencyTags": {
"somepackage.data.generic.impl.EmptyTagHolder": [ ]
},
"properties": {
"somepackage.data.generic.propertystore.impl.BasicEditablePropertyStore": {
"overlay": {
"somepackage.data.generic.propertystore.impl.NoopEditablePropertyStoreOverlay": { }
}
}
}
}
}
}
答: 暂无答案
评论
JsonSubTypes
EmptyTagHolder
TagHolder
EmptyTagHolder
Iterable
EmptyTagHolder
WRAPPER_OBJECT
"[package].EmptyTagHolder"
EmptyTagHolder