如何在下面的第一个代码中将“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;
}
}
答案 0 :(得分:1)
在Spring Batch作业中解析JSON真的有两个选择:
LineMapper
,请创建LineTokenizer
。 Spring Batch的DefaultLineMapper
将记录解析分为两个阶段,解析记录并将结果映射到对象。传入数据是JSON与CSV的事实只会影响解析部分(由LineTokenizer
处理)。话虽如此,您必须编写自己的LineTokenizer
来将JSON解析为FieldSet
。JsonLineMapper
。 Spring Batch提供了一个LineMapper
实现,它使用Jackson将JSON对象反序列化为java对象。在任何一种情况下,您都无法将LineMapper
映射到LineTokenizer
,因为他们完成了两件不同的事情。