杰克逊序列化 csv 属性顺序

2022-09-04 08:14:17

我们有一个包含350多个列的表。pojo 类被生成,getters 顺序被搞砸了。尝试使用来自 jackson 的 csvmapper,但它会根据 getter 顺序生成 csv。@JsonPropertyOrder也不可行,因为许多列。我们在 xml 中维护列顺序,并且可以在运行时生成字段顺序数组。我们可以在运行时重写以提供用于属性排序的字段名称数组吗?我们可以使用注释内省器进行自定义吗?


答案 1

您正在寻找的称为映射功能。您需要禁用属性的字母数字排序,默认情况下启用该排序:

CsvMapper mapper = new CsvMapper();
mapper.disable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);

您可以在此处找到有关此内容的更多信息:CsvSchema中添加一个功能以允许定义排序#42


答案 2

万一你在2020年来到这里,这直接来自文档

那么,如何获取要使用的 CSV 架构实例呢?有 3 种方法:

  • 基于 Java 类创建模式
  • 手动生成架构。
  • 使用 CSV 文档的第一行获取架构的名称(无类型) 以下是上述情况的代码:
// Schema from POJO (usually has @JsonPropertyOrder annotation)
CsvSchema schema = mapper.schemaFor(Pojo.class);

// Manually-built schema: one with type, others default to "STRING"
CsvSchema schema = CsvSchema.builder()
        .addColumn("firstName")
        .addColumn("lastName")
        .addColumn("age", CsvSchema.ColumnType.NUMBER)
        .build();

// Read schema from the first line; start with bootstrap instance
// to enable reading of schema from the first line
// NOTE: reads schema and uses it for binding
CsvSchema bootstrapSchema = CsvSchema.emptySchema().withHeader();
ObjectMapper mapper = new CsvMapper();
mapper.readerFor(Pojo.class).with(bootstrapSchema).readValue(json);