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

时间:2018-08-20 10:39:39

标签: spring spring-boot spring-batch

到目前为止我的方法:

@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

3 个答案:

答案 0 :(得分:3)

创建一个类 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;
}

答案 1 :(得分:2)

  

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

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

1。每行都是一个json对象

例如:

{object1}
{object2}

那么您有两个选择:

  • 使用JsonLineMapper返回Map<String, Object>。在这种情况下,您的阅读器还应该返回Map<String, Object>,并且您可以使用项目处理器将项目从Map<String, Object>转换为Blub(顺便说一句,将数据从一种类型转换为另一种类型是一种典型的用法物品处理机的情况)
  • 使用基于Jackson或Gson或任何其他库的LineMapper<Blub>的自定义实现(如@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)。

有与此类似的问题,我在这里添加以供参考:

答案 2 :(得分:1)

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

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