2016-04-29 46 views
0

我们有一张350多列的表格。 pojo类生成并且getters命令会搞砸。试图从jackson使用csvmapper,但它会根据getter命令生成csv。 @JsonPropertyOrder由于有许多列而不可行。我们在xml中维护列顺序,并且可以在运行时生成字段顺序数组。我们是否可以在运行时重写以提供用于属性排序的字段名称数组?我们可以使用注释introspector进行自定义吗?jackson serialize csv物业订单

回答

1

我相信在这里你唯一的选择是uniVocity-parsers,因为它可以让你选择写哪些列以及按什么顺序:

CsvWriterSettings settings = new CsvWriterSettings(); 
// Sets the file headers (used for selection only, these values won't be written automatically) 
settings.setHeaders("Year", "Make", "Model", "Description", "Price"); 

// Selects which fields from the input should be written. In this case, fields "make" and "model" will be empty 
// The field selection is not case sensitive 
settings.selectFields("description", "price", "year"); 

//configures the writer process java beans with annotations (assume TestBean has a few annotated fiedls) 
settings.setRowWriterProcessor(new BeanWriterProcessor<TestBean>(TestBean.class)); 

// Creates a writer with the above settings; 
CsvWriter writer = new CsvWriter(new File("/path/to/output.csv"), settings); 

// Writes the headers specified in the settings 
writer.writeHeaders(); 

//creates a bean instance for writing 
TestBean bean = new TestBean(); 
bean.setPrice(new BigDecimal("500.33")); 
bean.setDescription("Blah,blah"); 
bean.setYear(1997); 

//writes it 
writer.processRecord(bean); 

writer.close(); 

希望它能帮助。

披露:我是这个libary的作者,它是开源和免费的(Apache 2.0许可)

0

注意@JsonPropertyOrder不一定必须包括所有的属性,只是那些你是包括系列化。但要指示要序列化的内容,您可能需要使用@JsonProperty(用于指示要序列化的属性)和不同可见性(包括ObjectMapper.setVisibility()默认值,或通过@JsonAutoDetect为每个POJO)的组合。

不过,假设你不希望使用@JsonPropertyOrder,您可以:

  1. JacksonAnnotationIntrospector覆盖方法读取注解,提供自己的实现使用其他来源的(并不需要在所有来自注解)
  2. 如果使用杰克逊2.8.0,有指定每个类的默认值一些事情(见ObjectMapper.configOverride()对象),包括产权制度,

同样,你可以overri新途径如果要使用自定义条件进行包含/排除,则该方法会查找@JsonPropertyfindNameForDeserialization()和/或findNameForSerialization())。 还有其他包含/排除机制,如JSON视图(@JsonView),JSON过滤器。