如何防止CsvMapper在输出CSV中包含无法识别的字段?

时间:2019-04-23 13:59:42

标签: java jackson jackson-dataformat-csv

CsvMapper@JsonPropertyOrder一起使用时,所有未显式命名的字段都放在CSV记录的末尾。这意味着输入错误会导致不同的CSV顺序。

示例:

public class Example {
  public static void main(String[] args) throws JsonProcessingException {
    final CsvMapper csvMapper = new CsvMapper();
    System.out.println(csvMapper.writerWithSchemaFor(MyClass.class).writeValueAsString(new MyClass("test", true, 2)));
  }

  @Data
  @AllArgsConstructor
  @NoArgsConstructor
  @JsonPropertyOrder({"name", "code"})
  public static class MyClass {

    @JsonProperty("name")
    private String name;

    @JsonProperty("status")
    private boolean status;

    @JsonProperty("code")
    private Integer code;
  }
}

结果为:test,2,true。由于status未在@JsonPropertyOrder中明确命名,因此将其放在记录的末尾。如果CsvMapper抛出异常或根本没有序列化,我会更愿意。

另一个例子是,如果我将上面的@JsonPropertyOrder更改为@JsonPropertyOrder({"name", "stats", "code"})。请注意stats中的错字。这将产生与上述相同的CSV。

如何配置CsvMapper导致无法识别的属性失败或不序列化未在@JsonPropertyOrder中命名的属性?

1 个答案:

答案 0 :(得分:0)

恕我直言,@JsonPropertyOrder的唯一目的是使您有机会定义属性的顺序。关于未指定的字段,您只能使用alphabetic属性来控制其顺序。因此,注释将忽略拼写错误,而仅关心您在其value属性中指定的已知字段名称。

如果您需要对活动字段进行更详细的控制以进行反序列化,则可以在班级上使用@JsonIgnoreProperties或在字段上使用@JsonIgnore

这个比喻可能有用:考虑一个SQL语句–您SELECT表中的行,然后ORDER之后的结果集。这里的ORDER命令对结果集的长度或宽度也没有影响。