杰克逊不支持ISO日期格式

时间:2014-08-06 15:39:27

标签: java json date jackson

编写支持Xml和JSON媒体类型的Web服务。遵循ISO标准以支持日期格式yyyy-MM-dd'T'HH:mm:ss.SSSXXX 为了在xml中支持这种格式,我编写了一个DateAdapter类来完成日期字段的编组和取消编组。
JSON格式有一个CustomSerialization和Deserialization类。它的实现几乎与Adapter类相似。但它会抛出异常。

@Override
    public void serialize(Date aDate, JsonGenerator aJsonGenerator, SerializerProvider aSerializerProvider)
            throws IOException, JsonProcessingException {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
        String dateString = dateFormat.format(aDate);
        aJsonGenerator.writeString(dateString);
    }

例外:

Illegal pattern character 'X'
    at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:768)
  

使用jackson v2.2.1   工作适配器实现完全相同。

private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

    @Override
    public String marshal(final Date v) throws Exception {
        System.out.println(v);
        return dateFormat.format(v);
    }

    @Override
    public Date unmarshal(final String v) throws Exception {
        System.out.println(v);
        return dateFormat.parse(v);
    }

3 个答案:

答案 0 :(得分:2)

Java 7中添加了SimpleDateFormat模式字母X。您必须使用较低版本的JRE。

Javadoc 6Javadoc 7

答案 1 :(得分:0)

您可以创建反序列化器并将其用作@Annotation

公共类TemporalDeserializerLocalDateTime扩展了JsonDeserializer {

@Override
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationCtx)
        throws IOException, JsonProcessingException {
        ObjectCodec oc = jsonParser.getCodec();
        String content = oc.readValue(jsonParser, String.class);
        return LocalDateTime.parse(content);
    }
}

公共类PaymentResource {

@JsonDeserialize(using = TemporalDeserializerLocalDateTime.class)
    private LocalDateTime paymentDate;
}

答案 2 :(得分:-1)

Joop Eggen的评论解决了这个问题。从SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");的简单日期格式解决了问题。