如何使用MyType
密钥反序列化Map
,该密钥仅使用json格式的MyType
的id?
例如,给定
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class MyType {
String id;
... // Getters and setters for id
String longText;
}
public class MyData {
List<MyType> types;
@JsonIdentityReference(alwaysAsId = true) // Does not work
Map<MyType, Integer> countMap;
}
字符串
它正确地序列化MyData
:
{
"types": [
{
"id": "123",
"longText": "very long text 1 ..."
},
{
"id": "456",
"longText": "very long text 2 ..."
}
],
"countMap": {
"123": 100,
"456": 200
}
}
型
但是当我反序列化它时,我得到一个错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class MyType]
型
如何让Jackson正确地反序列化它?
2条答案
按热度按时间yshpjwxd1#
使用您在评论中提供的引用,可以使用扩展KeyDeserializer类的类来反序列化所提供的json。从你在下面的问题中定义的类的简化版本开始:
字符串
假设 types 字段始终存在,您可以创建一个扩展
KeyDeserializer
的自定义类:型
基本上,在
CountMap
Map的每个键的代码中,json将被解析为MyData
示例,然后搜索 types 元素以提取具有相同 id 的type元素,返回新的 MyType 键,并完成 longText 字段。nfs0ujit2#
我能够反序列化的唯一方法是使用自定义反序列化器。所以上这门课
字符串
和/或
型
运行下面的测试,我能够看到正确的json反序列化。
型