SpringBatch - 如何通过java配置设置JsonLineMapper来读取一个简单的json文件

时间:2015-07-17 23:55:41

标签: json spring spring-batch

如何在下面的第一个代码中将“setLineTokenizer(new DelimitedLineTokenizer()...)”更改为“JsonLineMapper”? Basicaly,它正在使用csv,但我想将其更改为读取一个简单的json文件。我在这里发现了一些线索询问复杂的json,但这不是我的情况。首先我认为我应该使用csv方式的一种非常不同的方法,但在我阅读SBiAch05sample.pdf(参见底部的链接和片段)后,我明白FlatFileItemReader可用于读取json格式。 在almost similiar question,我可以猜测我没有走错方向。请,我试图找到最简单但优雅和推荐的方法来修复此代码段。因此,下面的包装器,除非我真的有义务以这种方式工作,似乎更进一步。另外,包装器在我看来比我的试用版更具有Java 6风格,它利用了Java 7中的无穷方法(据我可以从研究中判断)。请高兴任何建议。

//我的代码

                @Bean
                @StepScope
                public FlatFileItemReader<Message> reader() {
                                log.info("ItemReader >>");
                                FlatFileItemReader<Message> reader = new FlatFileItemReader<Message>();
                                reader.setResource(new ClassPathResource("test_json.js"));
                                reader.setLineMapper(new DefaultLineMapper<Message>() {
                                                {
                                                                setLineTokenizer(new DelimitedLineTokenizer() {
{
                setNames(new String[] { "field1", "field2"...

//使用包装器的示例

http://www.manning.com/templier/SBiAch05sample.pdf

import org.springframework.batch.item.file.LineMapper;
import org.springframework.batch.item.file.mapping.JsonLineMapper;
import com.manning.sbia.ch05.Product;
public class WrappedJsonLineMapper implements LineMapper<Product> {
       private JsonLineMapper delegate;
       public Product mapLine(String line, int lineNumber) throws Exception {
                Map<String,Object> productAsMap
                               = delegate.mapLine(line, lineNumber);
              Product product = new Product();
              product.setId((String)productAsMap.get("id"));
              product.setName((String)productAsMap.get("name"));
              product.setDescription((String)productAsMap.get("description"));
              product.setPrice(new Float((Double)productAsMap.get("price")));
              return product;
       }
       public void setDelegate(JsonLineMapper delegate) {
              this.delegate = delegate;
       }
}

1 个答案:

答案 0 :(得分:1)

在Spring Batch作业中解析JSON真的有两个选择:

  1. 不要创建LineMapper,请创建LineTokenizer。 Spring Batch的DefaultLineMapper将记录解析分为两个阶段,解析记录并将结果映射到对象。传入数据是JSON与CSV的事实只会影响解析部分(由LineTokenizer处理)。话虽如此,您必须编写自己的LineTokenizer来将JSON解析为FieldSet
  2. 使用提供的JsonLineMapper。 Spring Batch提供了一个LineMapper实现,它使用Jackson将JSON对象反序列化为java对象。
  3. 在任何一种情况下,您都无法将LineMapper映射到LineTokenizer,因为他们完成了两件不同的事情。