gpt4 book ai didi

java - Java通用Map的序列化和反序列化及外部使用

转载 作者:行者123 更新时间:2023-12-02 12:48:24 25 4
gpt4 key购买 nike

我有一个Map<String, Object>我将其用作 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());

给出序列化形式{"test":1410721662084,"@class":"java.util.Date"}这看起来不错,但是当反序列化返回“测试”的类型为 Long .

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

这是针对 Jackson 2.4.2 的。

最佳答案

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

public class TestClass {
private Date test;
//getters and setters omitted
}

该类具有具体的结构,JSON 会将其序列化为

{ "test" : 1410721662084}

这是你的对象的更清晰和类型安全的表示。然后,您只需将 TestClass.class 传递给 readValue() 方法,您的 test 属性就会神奇地转换为正确的类型 (日期)

关于java - Java通用Map的序列化和反序列化及外部使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25837012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com