Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringBatch:如何设置FlatFileItemReader来读取json文件?_Spring_Spring Boot_Spring Batch - Fatal编程技术网

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

SpringBatch:如何设置FlatFileItemReader来读取json文件?,spring,spring-boot,spring-batch,Spring,Spring Boot,Spring Batch,我目前的做法是: @Bean FlatFileItemReader<Blub> flatFileItemReader() { FlatFileItemReader<Blub> reader = new FlatFileItemReader<>(); reader.setResource(new FileSystemResource("test.json")); JsonLineMapper lineMapper = new Json

我目前的做法是:

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

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

    JsonLineMapper lineMapper = new JsonLineMapper();

    reader.setLineMapper(lineMapper);

    return reader;
}
@Bean
FlatFileItemReader FlatFileItemReader(){
FlatFileItemReader=新的FlatFileItemReader();
setResource(新文件系统资源(“test.json”);
JsonLineMapper lineMapper=新的JsonLineMapper();
reader.setLineMapper(lineMapper);
返回读取器;
}

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

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

}
公共类BlubJsonLineMapper实现LineMapper{
私有对象映射器映射器=新对象映射器();
/**
*将该行解释为Json对象并从中创建Blub实体。
* 
*@see LineMapper#mapLine(字符串,int)
*/
@凌驾
公共Blub映射行(字符串行、整数行号)引发异常{
返回mapper.readValue(行,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;
}
@Bean
FlatFileItemReader FlatFileItemReader(){
FlatFileItemReader=新的FlatFileItemReader();
setResource(新文件系统资源(“test.json”);
BlubJsonLineMapper lineMapper=新的BlubJsonLineMapper();
reader.setLineMapper(lineMapper);
返回读取器;
}
如何设置FlatFileItemReader来读取json文件

这取决于json文件的格式:

1.每一行都是一个json对象(称为) 例如:

{object1}
{object2}
[
 {object1},
 {object2}
]
那么您有两个选择:

  • 1.1使用
    JsonLineMapper
    ,它返回一个
    Map
    。在这种情况下,读者还应该返回
    Map
    ,您可以使用项目处理器将项目从
    Map
    转换为
    Blub
    (顺便说一句,将数据从一种类型转换为另一种类型是项目处理器的典型用例)
  • 1.2使用基于Jackson或Gson或任何其他库的
    LineMapper
    自定义实现(如@clevertension的答案所示)
2.行被包装在一个json数组中 例如:

{object1}
{object2}
[
 {object1},
 {object2}
]
然后,您可以使用我们在4.1.0.M1版中引入的新的
jsonitmreader
(参见博客文章中的示例:)

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


我已经为Json构建了一个小演示。如果你需要更多,让我知道我可以为你建立另一个例子


Ty谢谢你的回答!有没有一种方法可以使用JsonLineMapper而不实现自己的LineMapper?JsonLineMapper是将everyline json转换为Map,但您的要求是转换为Blub,您可以使用匿名类在flatFileItemReader()中实现LineMapper{…}我正在摆弄格式1。你建议哪种选择最好?我完全是Spring batch的新手,我一直在琢磨如何正确操作。互联网上似乎没有一个完整的例子,除了这个和其他几个堆栈答案。是否所有读取JSON的批处理编码器都是专业的到目前为止,我已经能够编写以下代码:
public类DbsnpJsonItemReader扩展FlatFileItemReader{public DbsnpJsonItemReader(文件文件){Resource Resource=new gziplazyrource(文件);setResource(资源);setLineMapper(new JsonLineMapper());}