【问题标题】:Couldnot serialize OffsetDateTime in jackson xml无法在杰克逊 xml 中序列化 OffsetDateTime
【发布时间】:2019-09-05 09:41:38
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: java spring-boot java-8


    【解决方案1】:

    这是由于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 结构。基本上,jackson 是按原样序列化对象(例如,获取属性的值并为其创建一个 xml 元素)。

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

    代替:

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

    更改属性 getter 在序列化过程中处理此字段的方式

    @JacksonXmlProperty(localName = "InvoiceStatusDate")
    public LocalDateTime getInvoceStatusDate() {
        return formatInvoiceDate();
    }
    
    private LocalDateTime formatInvoiceDate() {
     // do processing logic here
    }
    

    如果没有要求将 InvoiceStatusDate 保留为 OffsetDate 时间,请将其保留为 LocalDateTime

    【讨论】:

      【解决方案2】:

      使用 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`

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-13
        • 2011-07-03
        相关资源
        最近更新 更多