将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
中命名的属性?
答案 0 :(得分:0)
恕我直言,@JsonPropertyOrder
的唯一目的是使您有机会定义属性的顺序。关于未指定的字段,您只能使用alphabetic
属性来控制其顺序。因此,注释将忽略拼写错误,而仅关心您在其value属性中指定的已知字段名称。
如果您需要对活动字段进行更详细的控制以进行反序列化,则可以在班级上使用@JsonIgnoreProperties
或在字段上使用@JsonIgnore
。
这个比喻可能有用:考虑一个SQL语句–您SELECT
表中的行,然后ORDER
之后的结果集。这里的ORDER
命令对结果集的长度或宽度也没有影响。