首页 > 解决方案 > 通过 XML Parser on Fly 将 ZonedDateTime 字符串映射到 LocalDateTime

问题描述

我有一个 XML 响应字符串: <timestamp ts="2018-12-05T08:00:00+02:00">55.5</timestamp>

JAXB我在注释的帮助下将其映射为:

public class Timestamp {
    @XmlAttribute(name = "ts")
    private String timeStampAsString;
    @XmlValue
    private Double value;

它可以正常工作,但我想自动解析DateTimefrom String,所以我理想的解决方案应该有

public class Timestamp {

    @XmlAttribute(name = "ts")
    private LocalDateTime timeStampAsLocalDateTime;
    @XmlValue
    private Double value;

我知道我可以在以下帮助下解析字符串:

ZonedDateTime.parse(zonedDateTimeAsString).toLocalDateTime();

但我不确定是否有办法解析 this on fly

标签: javaxmljaxbtimestampzoneddatetime

解决方案


这可以通过XmlAdapter.

创建一个扩展的类,XmlAdapter它转换StringLocalDateTime

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {

    @Override
    public LocalDateTime unmarshal(String v) throws Exception {
        if (v == null) {
            return null;
        }
        return ZonedDateTime.parse(v).toLocalDateTime();
    }

    @Override
    public String marshal(LocalDateTime v) throws Exception {
        if (v == null) {
            return null;
        }
        return v.toString();
    }
 }

并注释要转换为 LocalDateTime 的字段:

    @XmlAttribute(name="ts")
    @XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
    private LocalDateTime timeStampAsLocalDateTime;

(正如评论中已经提到的LocalDateTime可能有问题,OffsetDateTime或者Instant可能更合适。这种方法是相同的,只需替换类和解析逻辑)


推荐阅读