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

Spring Batch: How to setup a FlatFileItemReader to read a json file?

到目前为止,我的方法是:

1
2
3
4
5
6
7
8
9
10
11
12
@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


创建一个类BlubJsonLineMapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

中进行设置

1
2
3
4
5
6
7
8
9
10
11
12
@Bean
FlatFileItemReader<Blub> flatFileItemReader() {
    FlatFileItemReader<Blub> reader = new FlatFileItemReader<>();

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

    BlubJsonLineMapper lineMapper = new BlubJsonLineMapper();

    reader.setLineMapper(lineMapper);

    return reader;
}


How to setup a FlatFileItemReader to read a json file?

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

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

例如:

1
2
{object1}
{object2}

然后您有两个选择:

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

2.将行package在json数组中

例如:

1
2
3
4
[
 {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)。

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

  • 如何在Spring Batch中读取复杂的JSON?
  • 带有Spring Batch的Json Array读取器文件
  • 新的Spring JSON阅读器中是否存在错误,或者我做错了什么?


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

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