【问题标题】:LocalDate serialize csv with jackson-dataformat-csv errorLocalDate 用 jackson-dataformat-csv 错误序列化 csv
【发布时间】:2020-01-14 08:48:19
【问题描述】:

我尝试以两种方式序列化包含java.time.LocalDate 的对象,但都失败了。

  1. 带有@JsonUnwrapped@JsonFormat(shape=JsonFormat.Shape.STRING) 的注释得到错误:

    线程“main”com.fasterxml.jackson.dataformat.csv.CsvMappingException 中的异常:CSV 生成器不支持属性(嵌套对象)的对象值(通过引用链:java.util.ArrayList[0]->models .DateRange["finish"]->java.time.LocalDate["chronology"])

@Data
@AllArgsConstructor
@NoArgsConstructor
//@JsonFormat(shape=JsonFormat.Shape.STRING)
public class DateRange {
  @JsonUnwrapped
  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate start;
  @JsonUnwrapped
  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate finish;
}

--------
public class CsvPractice {
  public static void main(String[] args) throws JsonProcessingException {
    ArrayList<DateRange> csv = Lists.newArrayList();
    for (int i = 1; i < 6; i++) {
      csv.add(new DateRange(LocalDate.now().plusDays(i), LocalDate.now().plusDays(i + 1)));
    }
    CsvMapper mapper = new CsvMapper();
//    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    CsvSchema schema = mapper.schemaFor(DateRange.class).withHeader();
    System.out.println(mapper.writer(schema).writeValueAsString(csv));
  }
}
  1. 配置映射器mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 对象上没有注释但得到:

    线程“main”com.fasterxml.jackson.dataformat.csv.CsvMappingException 中的异常:CSV 生成器不支持属性(嵌套对象)的对象值(通过引用链:java.util.ArrayList[0]->models .DateRange["完成"])

@Data
@AllArgsConstructor
@NoArgsConstructor
//@JsonFormat(shape=JsonFormat.Shape.STRING)
public class DateRange {
//  @JsonUnwrapped
//  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate start;
//  @JsonUnwrapped
//  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate finish;
}
---------
public class CsvPractice {
  public static void main(String[] args) throws JsonProcessingException {
    ArrayList<DateRange> csv = Lists.newArrayList();
    for (int i = 1; i < 6; i++) {
      csv.add(new DateRange(LocalDate.now().plusDays(i), LocalDate.now().plusDays(i + 1)));
    }
    CsvMapper mapper = new CsvMapper();
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    CsvSchema schema = mapper.schemaFor(DateRange.class).withHeader();
    System.out.println(mapper.writer(schema).writeValueAsString(csv));
  }
}

我的杰克逊版本是:

    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-csv</artifactId>
      <version>2.9.8</version>
    </dependency>

我错过了什么?

参考

【问题讨论】:

    标签: java csv jackson


    【解决方案1】:

    您的代码就快到了。您的问题是您的映射器没有正确序列化LocalDate

    要启用 Jackson 对 Java 8 日期和时间类型的序列化,您需要包含以下模块:

    https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.10.1

    完成此操作后,您需要修改代码为 Jackson 注册 JSR-310 模块,然后指示它禁用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS

    所以基于上述,包含模块,然后只需做以下代码更改:

    CsvMapper mapper = new CsvMapper();
    mapper.findAndRegisterModules();
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    

    完成后你的预期结果应该是这样的:

    finish,start
    2020-01-16,2020-01-15
    2020-01-17,2020-01-16
    2020-01-18,2020-01-17
    2020-01-19,2020-01-18
    2020-01-20,2020-01-19
    

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2017-03-06
      • 1970-01-01
      • 2017-01-11
      • 2018-09-29
      相关资源
      最近更新 更多