Java和外部使用的通用映射的序列化和反序列化

Java和外部使用的通用映射的序列化和反序列化,java,json,jackson,Java,Json,Jackson,我有一个映射,我正在使用它作为JSON文档的映射,但是我希望在保留文档结构的同时创建和维护Java类型信息 我正在尝试使用Jackson创建文档,它似乎工作正常,但在尝试反序列化它时,我看到了一些奇怪的东西。一个非常简单的序列化示例: final ObjectMapper mapper = new ObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.

我有一个
映射
,我正在使用它作为JSON文档的映射,但是我希望在保留文档结构的同时创建和维护Java类型信息

我正在尝试使用Jackson创建文档,它似乎工作正常,但在尝试反序列化它时,我看到了一些奇怪的东西。一个非常简单的序列化示例:

final ObjectMapper mapper = new ObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.EXTERNAL_PROPERTY);
final Map<String, Object> map = Maps.newHashMap();
map.put("test", new Date());
final String ser = mapper.writeValueAsString(map);
final Map<String, Object> deser = mapper.readValue(ser, new TypeReference<HashMap<String, Object>>(){});
System.err.println(deser.get("test").getClass());
final ObjectMapper mapper=new ObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_和_NON_具体,JsonTypeInfo.As.EXTERNAL_属性);
final Map=Maps.newHashMap();
map.put(“测试”,新日期());
最后一个字符串ser=mapper.writeValueAsString(map);
final-Map-desr=mapper.readValue(ser,new-TypeReference(){});
System.err.println(desr.get(“test”).getClass());
给出序列化形式
{“test”:1410721662084,“@class”:“java.util.Date”}
,该形式看起来不错,但反序列化时返回的“test”类型为
Long

如果我将类型序列化更改为使用
WRAPPER\u ARRAY
而不是
EXTERNAL\u PROPERTY
,则“test”类型将正确返回为
Date
,但这样做会改变JSON文档的结构,因此我不允许这样做。如何保留文档的结构并允许反序列化返回正确的类型


这与Jackson 2.4.2背道而驰。

使用maps反序列化总是很棘手,因为maps不保留类型信息,这使得Jackson求助于
@class
,而这不是您通常想要的。相反,您可以创建一个简单的类:

public class TestClass {
   private Date test;
   //getters and setters omitted 
}
这个类有具体的结构,JSON将把它序列化为

{ "test" : 1410721662084}

这是一种更清晰、类型安全的对象表示形式。然后,您只需将
TestClass.class
传递到
readValue()
方法,您的
test
属性将被神奇地转换为正确的类型(
Date

感谢您的响应,但我无法确定哪些对象将被放置在
映射中,因此无法沿着这条路线前进。正如问题中所解释的,示例代码旨在强调问题,而不是代表我试图解决的问题。虽然我认识到了这些缺点,但我确实希望Jackson在反序列化时使用
@class
信息,但事实并非如此。@jgm您的外部客户端也会使用Jackson吗?因为使用
@class
属性将使其与jackson相关。不,它们将忽略
@class
属性。有趣的问题。在没有自定义反序列化程序的情况下尝试并解决这个问题会更有趣,但如果这被证明是不可能的,自定义反序列化程序是一个选项吗?