Java 如何将带有类型信息的json反序列化到映射<;字符串,对象>;?

Java 如何将带有类型信息的json反序列化到映射<;字符串,对象>;?,java,serialization,jackson,polymorphism,deserialization,Java,Serialization,Jackson,Polymorphism,Deserialization,我有一个类SomeClass: public class SomeClass { public String someString = "SOME-STRING-VALUE"; public Date someDate = new Date(); } 我的目标是创建一个Map,其中包含SomeClass的成员名称作为键,它们的值作为SomeClass给定实例的Map中的值 为此,我使用Jackson,如下所示: SomeClass someObject = new SomeC

我有一个类
SomeClass

public class SomeClass {
    public String someString = "SOME-STRING-VALUE";

    public Date someDate = new Date();
}
我的目标是创建一个
Map
,其中包含
SomeClass
的成员名称作为键,它们的值作为
SomeClass
给定实例的Map中的值

为此,我使用Jackson,如下所示:

SomeClass someObject = new SomeClass();

ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(someObject);    // serialize object
System.out.println(jsonString);    // {"someString":"SOME-STRING-VALUE","someDate":1500138786720}

Map<String, Object> objectMap = mapper.readValue(jsonString, Map.class);    // deserialize back to Map instead of SomeClass
objectMap.forEach((k, v) -> System.out.println(k + " : " + v + " : " + v.getClass()));
// This prints:
// someString : SOME-STRING-VALUE : class java.lang.String
// someDate : 1500138786720 : class java.lang.Long
SomeClass-someObject=new-SomeClass();
ObjectMapper mapper=新的ObjectMapper();
字符串jsonString=mapper.writeValueAsString(someObject);//序列化对象
System.out.println(jsonString);//{“someString”:“SOME-STRING-VALUE”,“someDate”:1500138786720}
Map objectMap=mapper.readValue(jsonString,Map.class);//反序列化回Map而不是SomeClass
forEach((k,v)->System.out.println(k+“:“+v+”:“+v.getClass());
//这张照片是:
//someString:SOME-STRING-VALUE:class java.lang.STRING
//someDate:1500138786720:class java.lang.Long
因此,我使用对象映射器将对象序列化为
jsonString
,然后为了创建所需的映射,我将
jsonString
反序列化为
映射

这里的问题是,
Date
字段被序列化为一个原始长值,当反序列化回时,它被反序列化为一个
long
,而不是
Date
,因为我正在反序列化它到
对象
。如果我对
SomeClass
进行反序列化,则
Long
值将转换为相关的
Date
值。但在我的例子中,当反序列化时,
映射器在反序列化之前不知道
someDate
的实际类型,因此
someDate
objectMap
中被反序列化为
Long
本身

似乎确实有一种方法可以让映射程序在序列化之前知道
jsonString
中给定字段的类型,方法是使用将类型信息嵌入
jsonString
中。为此,在编写
jsonString
之前,我使用以下命令启用了默认键入:

mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL)

我现在得到的
jsonString
是:

[“some.package.name.here.SomeClass”,{“someString”:“some-STRING-VALUE”,“someDate”:[“java.util.Date”,1500140185993]}]

因此
jsonString
现在包含
someDate
字段的类型。但是我很难将这个
jsonString
中的类型信息读回我的
objectMap
。我得到一个例外:

java.lang.IllegalArgumentException:Class some.package.name.here.SomeClass 不是[映射类型;类java.util.map,[简单类型,类]的子类型 java.lang.Object]->[简单类型,类java.lang.Object]]

我是否需要更改行
Map objectMap=mapper.readValue(jsonString,Map.class)
到其他内容,让映射器知道它要读取的字符串不是普通字符串,而是包含类型信息的字符串。映射程序不应该已经知道这一点,因为我们用来读取
jsonString
的映射程序对象就是编写它的映射程序对象吗

我发现的所有示例都遵循继承层次结构示例,在阅读该示例时,它们将只传递基类,但我无法弄清楚我该如何处理我的案例

如何将
someDate
字段从
Long
转换回
Date
,同时将其放入具有
对象
值类型的映射中