我有一个泛型类,如下所示:
public class Pojo<T> {
@JsonProperty("value")
public T[] values;
};
T可以包含String
、LocalDateTime
或Integer
。String和Integer之间的区别似乎很好,很可能是因为这些类型在序列化的JSON文件中的表示方式不同。但是,当我在JSON对象中包含日期时间时(见示例),它仍然被解析为字符串。value
字段实际使用的类型由输入决定。虽然我在下面的最小示例中确实了解了这一点,但这并不适用于我的程序中这段代码的所有用法。我只能依赖于value
字段值的模式。
public class Main {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
String json = "{\"value\": \"2022-02-22T12:00:00\"}";
Pojo<?> deserialized = mapper.readValue(json, Pojo.class);
assert deserialized.value[0] instanceof LocalDateTime;
}
我对JsonTypeInfo
的修改还没有取得任何成功。如果值字段的所有值都符合yyyy-MM-dd'T'hh:mm:ss
模式,是否有办法将该字段解析为LocalDateTime
对象的数组?
1条答案
按热度按时间kuuvgm7e1#
这就是你的问题-
Pojo<?> deserialized = mapper.readValue(json, Pojo.class)
。ObjectMapper不知道要将
T
解析为什么类型。要告诉它类型,您需要使用readValue
重载和TypeReference,或者使用JavaType重载。我发现JavaType
更容易阅读,所以下面是一个示例:当构造参数
JavaType
时,第一个参数是类本身,接下来是具体的泛型类型。**编辑:**记住新信息,我能想到的最好的是自定义反序列化器,它在运行时解析类型。类似于:
这个想法是尝试解析为
LocalDateTime
,如果不可能,尝试解析为int
,如果不可能,再次保留为String
。这是一个相当丑陋的方式来做,但我只是试图说明这个想法。与其捕捉异常,不如检查格式,例如使用regex,并根据哪个regex匹配,解析到正确的类型。我用string和int测试了它,它实际上是有效的。