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
,同时将其放入具有对象
值类型的映射中