使用Jackson将使用generics的类序列化为JSON
我有一个表示调查问卷的对象结构,我需要序列化为JSON。 结构的一个类是OpenQuestion,这个类使用带有两个参数的generics。 当使用的类型之一是Date时,问题开始,日期序列化错误,如长。
class级代码:
public class OpenQuestion extends AbstractQuestion implements Serializable { private valueType value; private validationType minValue; private validationType maxValue; ... }
我看到如果哈希映射总是使用Date,如何在哈希映射中序列化日期,但在这种情况下,我使用带有String,Integer或Date的类。
有什么想法解决它吗? 谢谢
正如@MiserableVariable指出的那样,Jackson默认将(大多数)日期字段序列化为(数字长)时间戳。 您可以通过多种方式覆盖此行为。
如果使用自己的ObjectMapper实例,则覆盖属性以将日期写为ISO-8601:
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
如果使用您自己的ObjectMapper实例,请使用您自己的自定义格式编写日期:
objectMapper.setDateFormat(myDateFormat); // 1.8 and above objectMapper.getSerializationConfig().setDateFormat(myDateFormat); // for earlier versions (deprecated for 1.8+)
要保留大多数字段的默认序列化行为,但为某些对象上的某些字段覆盖它,请使用自定义序列化程序:
public class MyBean implements Serializable { private Date postDate; // ... constructors, etc @JsonSerialize(using = MyCustomDateSerializer.class) public Date getPostDate() { return postDate; } } public class MyCustomDateSerializer extends JsonSerializer { @Override public void serialize(final Date date, final JsonGeneraror generator, final SerializerProvider provider) throws IOException, JSONProcessingException { generator.writeString(yourRepresentationHere); } }
所有这些信息都可以在Jackson文档中找到 ,其中大部分内容都在处理日期处理的部分 。
您可以为此添加JsonTypeInfo
注释。 有两种方法可以使用它:
- 让它自动为您的对象添加类型注释,因此它知道将其反序列化为什么。
- 添加自定义类型解析程序,以便为您处理此问题。
第一个会使您的JSON变得丑陋,但只需要很少的额外代码,并且不会强制您制作自定义序列化程序。 后者更难,但会产生更清晰的JSON。 总体而言,问题部分在于您的某个类型未在JSON(日期)中建模,因此您可能需要将其序列化为JSON文件中的整数或字符串类型。
前一个选项看起来有点像这样:
@JsonTypeInfo( use = Id.CLASS, include = As.WRAPPER_PROPERTY ) private valiationType minValue;
这应该编码一个String值,如下所示:
{ __type = "java.lang.String", value = "Hello, World" }
没有任何承诺是准确的,因为这主要来自记忆!
这取决于。 如果您确实知道期望的类型,则只需传递generics类型引用:
OpenQuestion v = objectMapper.readValue(json, new TypeReference>() { });
正如预期的类型一样,jackson的线索。
如果你不知道,那么另一个答案显示了如何使用@JsonTypeInfo
。