3

我有一个代表问卷的对象结构,我需要序列化为 JSON。结构的一类是 OpenQuestion,此类使用具有两个参数的泛型。当使用的类型之一是 Date 时,问题就开始了,日期序列化错误,比如 long。

班级代码:

public class OpenQuestion <valueType,validationType> extends AbstractQuestion implements    Serializable {
    private valueType value;
    private validationType minValue;
    private validationType maxValue;
    ...
}

如果哈希映射始终使用日期,我看到了如何序列化哈希映射中的日期,但在这种情况下,我使用带有字符串、整数或日期的类。

有什么办法解决吗?谢谢

4

3 回答 3

7

您可以JsonTypeInfo为此添加注释。有两种使用方法:

  • 让它自动为您的对象添加类型注释,因此它知道将其反序列化为什么。
  • 添加自定义类型解析器,为您处理此问题。

第一个将使您的 JSON 变得丑陋,但只需要很少的额外代码,并且不会强迫您制作自定义序列化程序。后者更难,但会产生更干净的 JSON。总体而言,问题部分在于您的一种类型没有以 JSON(日期)建模,因此您可能需要在 JSON 文件中将其序列化为整数或字符串类型。

前一个选项看起来有点像这样:

@JsonTypeInfo( use = Id.CLASS, include = As.WRAPPER_PROPERTY )
private valiationType minValue;

应该编码一个字符串值,例如:

{ __type = "java.lang.String", value = "Hello, World" }

没有保证准确,因为这主要来自记忆!

于 2012-11-17T17:27:09.230 回答
4

这取决于。如果您确实知道预期类型,则只需传递泛型类型引用:

OpenQuestion<Value,Validation> v = objectMapper.readValue(json,
  new TypeReference<OpenQuestion<Value,Validation>>() { });

因为这暗示了杰克逊的预期类型。

如果您不知道,那么另一个答案显示了如何使用@JsonTypeInfo.

于 2012-11-19T20:48:15.443 回答
2

正如@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<Date> {

    @Override
    public void serialize(final Date date, final JsonGeneraror generator,
          final SerializerProvider provider) throws IOException,
          JSONProcessingException {

        generator.writeString(yourRepresentationHere);
    }
}

所有这些信息都可以在Jackson Documentation中找到,其中大部分在处理日期处理的部分中。

于 2012-11-17T17:57:28.140 回答