【问题标题】:Spring Batch: How to setup a FlatFileItemReader to read a json file?Spring Batch:如何设置 FlatFileItemReader 来读取 json 文件?
【发布时间】:2019-01-26 11:29:00
【问题描述】:

到目前为止我的方法:

@Bean
FlatFileItemReader<Blub> flatFileItemReader() {
    FlatFileItemReader<Blub> reader = new FlatFileItemReader<>();

    reader.setResource(new FileSystemResource("test.json"));

    JsonLineMapper lineMapper = new JsonLineMapper();

    reader.setLineMapper(lineMapper);

    return reader;
}

挑战是:reader.setLineMapper() 不能使用JsonLineMapper。如何正确使用JsonLineMapper

【问题讨论】:

    标签: spring spring-boot spring-batch


    【解决方案1】:

    创建一个类BlubJsonLineMapper

    public class BlubJsonLineMapper implements LineMapper<Blub> {
    
        private ObjectMapper mapper = new ObjectMapper();
    
    
        /**
         * Interpret the line as a Json object and create a Blub Entity from it.
         * 
         * @see LineMapper#mapLine(String, int)
         */
        @Override
        public Blub mapLine(String line, int lineNumber) throws Exception {
            return mapper.readValue(line, Blub.class);
        }
    
    }
    

    然后你可以在 FlatFileItemReader 中设置

    @Bean
    FlatFileItemReader<Blub> flatFileItemReader() {
        FlatFileItemReader<Blub> reader = new FlatFileItemReader<>();
    
        reader.setResource(new FileSystemResource("test.json"));
    
        BlubJsonLineMapper lineMapper = new BlubJsonLineMapper();
    
        reader.setLineMapper(lineMapper);
    
        return reader;
    }
    

    【讨论】:

    • 为您解答!有没有办法使用 JsonLineMapper 而不是实现自己的 LineMapper?
    • JsonLineMapper 是将 everyline json 转换为 Map,但您的要求是转换为 Blub,您可以使用匿名在你的 flatFileItemReader() {....} 中实现 LineMapper 的类
    【解决方案2】:

    如何设置 FlatFileItemReader 来读取 json 文件?

    这取决于你的 json 文件的格式:

    1。每行都是一个json对象(称为NDJson

    例如:

    {object1}
    {object2}
    

    那么你有两个选择:

    • 1.1 使用返回Map&lt;String, Object&gt;JsonLineMapper。在这种情况下,您的阅读器还应该返回Map&lt;String, Object&gt;,并且您可以使用项目处理器将项目从Map&lt;String, Object&gt; 转换为Blub(顺便说一句,将数据从一种类型转换为另一种类型是项目处理器的典型用例)
    • 1.2 使用基于 Jackson 或 Gson 或任何其他库的LineMapper&lt;Blub&gt; 的自定义实现(如@clevertension 的答案所示)

    2。行被包裹在一个 json 数组中

    例如:

    [
     {object1},
     {object2}
    ]
    

    那么您可以使用我们在 4.1.0.M1 版本中引入的新 JsonItemReader(请参阅此处博客文章中的示例:https://spring.io/blog/2018/05/31/spring-batch-4-1-0-m1-released#add-a-new-json-item-reader)。

    这个问题也有类似的问题,我这里补充一下供参考:

    【讨论】:

    • 我在摆弄格式 1。您建议哪个选项最好?我是 Spring 批次的新手,我一直在思考如何正确地做到这一点。除了这个和其他几个堆栈答案之外,互联网上似乎没有一个完整的例子。阅读 JSON 的每个批处理编码器都已经是专业的了吗? :O
    • 到目前为止,我已经能够编写此代码:public class DbsnpJsonItemReader extends FlatFileItemReader&lt;Map&lt;String, Object&gt;&gt; { public DbsnpJsonItemReader(File file) { Resource resource = new GzipLazyResource(file); setResource(resource); setLineMapper(new JsonLineMapper()); }
    【解决方案3】:

    我为 Json 构建了一个小演示。如果您需要更多,请告诉我,我可以为您构建另一个示例

    https://github.com/bigzidane/spring-batch-jsonListItem-reader

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 2019-11-05
      • 2019-08-22
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2012-07-30
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多