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; } |
面临的挑战是:
创建一个类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版本中引入的新
有与此类似的问题,我在这里添加以供参考:
- 如何在Spring Batch中读取复杂的JSON?
- 带有Spring Batch的Json Array读取器文件
- 新的Spring JSON阅读器中是否存在错误,或者我做错了什么?
我已经为Json构建了一个小型演示。如果您还需要更多,请告诉我,我可以为您构建另一个示例
https://github.com/bigzidane/spring-batch-jsonListItem-reader