【问题标题】:Ignore different fields in CSV and JSON忽略 CSV 和 JSON 中的不同字段
【发布时间】:2018-02-12 11:38:48
【问题描述】:

我有一个通常只输出 JSON 的 Spring REST API。

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

Jackson 有一个库

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

我可以使用 Spring 的 HttpMessageConverter 来使用它。

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

作为替代方案,我考虑使用自定义界面来提取值以预先序列化值。 List&lt;CSVableDTO&gt; -> List&lt;Map&lt;String,?&gt;&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"

【问题讨论】:

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


    【解决方案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() {
               // ...
           }
    }
    

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

    【讨论】:

    • 这看起来是一个很有前途的解决方案。虽然我不想在我的所有控制器中创建一个新方法来使它们能够提供 CSV。 (也许stackoverflow.com/questions/22875642/jackson-set-default-view)可以提醒我避免重复方法。)我会测试它然后报告。
    • Jackson CSV 映射器有一些问题,但您的解决方案有效(至少在使用 JSON 时)。
    猜你喜欢
    • 2015-02-23
    • 2019-07-12
    • 2018-11-18
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多