杰克逊序列化 csv 属性顺序
2022-09-04 08:14:17
我们有一个包含350多个列的表。pojo 类被生成,getters 顺序被搞砸了。尝试使用来自 jackson 的 csvmapper,但它会根据 getter 顺序生成 csv。@JsonPropertyOrder也不可行,因为许多列。我们在 xml 中维护列顺序,并且可以在运行时生成字段顺序数组。我们可以在运行时重写以提供用于属性排序的字段名称数组吗?我们可以使用注释内省器进行自定义吗?
我们有一个包含350多个列的表。pojo 类被生成,getters 顺序被搞砸了。尝试使用来自 jackson 的 csvmapper,但它会根据 getter 顺序生成 csv。@JsonPropertyOrder也不可行,因为许多列。我们在 xml 中维护列顺序,并且可以在运行时生成字段顺序数组。我们可以在运行时重写以提供用于属性排序的字段名称数组吗?我们可以使用注释内省器进行自定义吗?
您正在寻找的称为映射功能。您需要禁用属性的字母数字排序,默认情况下启用该排序:
CsvMapper mapper = new CsvMapper();
mapper.disable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
您可以在此处找到有关此内容的更多信息:在CsvSchema
中添加一个功能以允许定义排序#42
万一你在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);