【问题标题】:Jackson does not support ISO date formatJackson 不支持 ISO 日期格式
【发布时间】:2014-08-06 15:39:27
【问题描述】:

编写支持 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)

使用杰克逊 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);
    }

【问题讨论】:

  • Z 而不是 XXX 呢?还是 XXXX?
  • 请务必查看您实际使用的 java 版本的 api 文档。
  • @JoopEggen 你是对的。感谢您的回答。
  • @HimanshuYadav 这没有解释错误消息。此外,不允许使用四个 X
  • 好吧Z 并没有完全解决错误。与Z 的日期看起来像2014-08-06T13:18:30.504-0400 但与XXX 的日期看起来像2014-08-06T13:18:30.504-04:00

标签: java json date jackson


【解决方案1】:

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

Javadoc 6Javadoc 7

【讨论】:

  • 那么 SimpleDateFormat 怎么会为我用于 Xml 响应的 XmlAdapter 类工作。
  • @HimanshuYadav 我不这么认为。 XmlAdapter 可能没有被使用。
  • 对不起。但事实并非如此。如果我删除 XmlAdapter,响应会采用不同的格式。
  • 我已经找到了解决方案。
【解决方案2】:

您可以创建一个反序列化器并将其用作@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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2023-01-03
      • 2016-03-06
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      相关资源
      最近更新 更多