忽略CSV和JSON中的不同字段

时间:2017-09-04 08:55:21

标签: java spring rest jackson export-to-csv

我有Spring REST API,通常只输出JSON。

现在我还想为某些端点导出CSV。

杰克逊有一个图书馆

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
    <version>2.8.5</version>
</dependency>

我可以使用Spring HttpMessageConverter

但是我需要在CSV中排除一些JSON中存在的字段,因此我不能使用@JsonIgnore注释。有没有办法为CSV使用不同的ignore属性/注释?

作为替代方案,我考虑使用自定义界面提取值以预先序列化值。 List<CSVableDTO> - &gt; List<Map<String,?>> - &gt; CSV。但我想避免这种情况,因为它涉及额外的实例创建和额外的编码,而不仅仅是使用新的注释。

Java的类的示例:

public class MyDTO {

    @CSVIgnore
    public int id;
    public String name;
    public String property;
    @CSVIgnore
    public String ref;

}

JSON-示例:

[
    {
        "id": 42,
        "name": "Example",
        "property": "FooBar",
        "ref": "42:Not:FooBar:1337"
    }
]

预期-CSV-结果:

"name";"property"
"Example";"FooBar"

1 个答案:

答案 0 :(得分:1)

请考虑使用JsonView mechanism。你会有类似的东西:

public class Foo {

     public interface JsonOnly{}
     public interface CsvView{}

     @JsonView(JsonOnly.class) 
     private Integer secretNotForCsv;

     // ...

}

@RestController
public class FooController {

       @RequestMapping(...)
       @JsonView(Foo.JsonOnly.class)
       public Foo getJson() {
           // ...
       }

       @RequestMapping(...)
       @JsonView(Foo.CsvView.class)
       public Foo getCsv() {
           // ...
       }
}

这只是一个非常粗略的草图,但它应该给你一个想法。