无法在杰克逊xml

时间:2019-09-05 09:41:38

标签: java spring-boot java-8

我正在使用Jackson库将POJO映射到XML。序列化OffsetDateTime字段时,我得到了包含在父标记内的多个标记中的输出。

compile ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.0')

当尝试序列化如下所示的OffsetDateTime字段时,

 @JacksonXmlProperty(localName = "InvoiceStatusDate")
 private OffsetDateTime invoiceStatusDate;

我将解析的XML作为

<InvoiceStatusDate>
   <offset>
      <totalSeconds>19800</totalSeconds>
      <id>+05:30</id>
      <rules>
         <fixedOffset>true</fixedOffset>
         <transitions />
         <transitionRules />
      </rules>
   </offset>
   <hour>14</hour>
   <minute>48</minute>
   <second>43</second>
   <nano>988195000</nano>
   <monthValue>9</monthValue>
   <year>2019</year>
   <month>SEPTEMBER</month>
   <dayOfMonth>4</dayOfMonth>
   <dayOfWeek>WEDNESDAY</dayOfWeek>
   <dayOfYear>247</dayOfYear>
</InvoiceStatusDate>

但是我需要类似的东西

 <InvoiceStatusDate>2019-09-05T15:08:53.549+05:30</InvoiceStatusDate>

2 个答案:

答案 0 :(得分:0)

这归因于OffsetDateTime类型的结构。

public final class OffsetDateTime implements Temporal, TemporalAdjuster, Comparable<OffsetDateTime>, Serializable {
    public static final OffsetDateTime MIN;
    public static final OffsetDateTime MAX;
    private static final long serialVersionUID = 2287754244819255394L;
    private final LocalDateTime dateTime;
    private final ZoneOffset offset;
    /*
      ....
    */
}

它具有LocalDateTimeZoneOffset作为属性。

LocalDateTime相同:

public final class LocalDateTime implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable {
        public static final LocalDateTime MIN;
        public static final LocalDateTime MAX;
        private static final long serialVersionUID = 6207766400415563566L;
        private final LocalDate date;
        private final LocalTime time;
        /*
         ...
        */
}

我将让您检查ZoneOffset的结构。杰克逊基本上是按原样序列化对象(例如,获取属性值并为其创建xml元素)。

您可以做的就是修改属性的呈现方式

而不是:

@JacksonXmlProperty(localName = "InvoiceStatusDate")
 private OffsetDateTime invoiceStatusDate;

要做

更改属性获取器在序列化过程中如何处理此字段

@JacksonXmlProperty(localName = "InvoiceStatusDate")
public LocalDateTime getInvoceStatusDate() {
    return formatInvoiceDate();
}

private LocalDateTime formatInvoiceDate() {
 // do processing logic here
}

OR

如果不需要将 InvoiceStatusDate 保留为OffsetDate时间,请将其保留为LocalDateTime

答案 1 :(得分:0)

使用Jackson库将日期从java.time解析为JSON时,存在类似的问题。基本上,您需要提供格式信息:

@JacksonXmlProperty(localName = "InvoiceStatusDate")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    public ZonedDateTime getInvoiceStatusDate() {
        return invoiceStatusDate;
    }

有关更多信息,请查看以下两个问题:Spring Data JPA - ZonedDateTime format for json serializationJackson deserialize date from Twitter to `ZonedDateTime`

相关问题