通过 XML 动态解析器将 ZonedDateTime 字符串映射到 LocalDateTime
Map ZonedDateTime String to LocalDateTime by XML Parser on Fly
我有一个 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;
它可以正常工作,但我想自动从 String
解析 DateTime
,所以我理想的解决方案应该是
public class Timestamp {
@XmlAttribute(name = "ts")
private LocalDateTime timeStampAsLocalDateTime;
@XmlValue
private Double value;
我知道我可以借助以下工具解析字符串:
ZonedDateTime.parse(zonedDateTimeAsString).toLocalDateTime();
但是我不确定是否有办法解析这个on fly
。
这可以通过 XmlAdapter
来完成。
创建一个扩展 XmlAdapter
的 class,将 String
转换为 LocalDateTime
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
可能更合适。这种方法是相同的,只需替换 classes 和解析逻辑)
我有一个 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;
它可以正常工作,但我想自动从 String
解析 DateTime
,所以我理想的解决方案应该是
public class Timestamp {
@XmlAttribute(name = "ts")
private LocalDateTime timeStampAsLocalDateTime;
@XmlValue
private Double value;
我知道我可以借助以下工具解析字符串:
ZonedDateTime.parse(zonedDateTimeAsString).toLocalDateTime();
但是我不确定是否有办法解析这个on fly
。
这可以通过 XmlAdapter
来完成。
创建一个扩展 XmlAdapter
的 class,将 String
转换为 LocalDateTime
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
可能更合适。这种方法是相同的,只需替换 classes 和解析逻辑)