我必须修改使用SpringBatch创建的进程,这个过程很容易。 实际上,程序从数据库中读取记录并将结果导出到XML文件(每个表一个)
现在,我想写JSON文件而不是XML文件,我没有找到如何使它成为可能,但阅读和阅读我有一些接近我想要的东西。
我写了一个ItemProcessor
这样的课程
@Component("jSONObjectProcessor")
public class JSONObjectProcessor implements ItemProcessor<Object, String> {
private Gson gson = new Gson();
private List<Object> array = new ArrayList<Object>();
@Override
public String process(Object item) throws Exception {
array.add(item);
return gson.toJson(array);
}
}
显然,如果我有6 items
;这将返回6 List
,就像它现在一样
第1项
[
{
"number":0,
"string":"abc",
"desc":"abcdefg"
}
]
第二项
[
{
"number":0,
"string":"abc",
"desc":"abcdefg"
},
{
"number":1000,
"string":"xyz",
"desc":"uvwxyz"
}
]
//more lists by the total of items
要编写我正在使用org.springframework.batch.item.file.FlatFileItemWriter
类的文件。
我想找到返回List中所有项目并给它JSON格式并在文件中写入这个json的方法。我是以正确的方式或者有另一种更优雅的形式。有可能吗?
谢谢!
更新
我做了更改(感谢@Sanj),但我错过了每个对象之间的逗号(,)分隔符。
我的ItemWriter
定义如下
<bean id="itemWriterRegConstantes" scope="step"
class="org.springframework.batch.item.file.FlatFileItemWriter">
<property name="resource" value="#{jobParameters['fileOutput']}" />
<property name="shouldDeleteIfExists" value="true" />
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="delimiter" value="," />
</bean>
</property>
<property name="footerCallback" ref="headerFooterCallback" />
<property name="headerCallback" ref="headerFooterCallback" />
</bean>
输出文件现在看起来像这样
[
{"number":0,"string":"abcd","desc":"efgh"} //no comma
{"number":1000,"string":"xyz","valor":"xyzw"}
]
如何添加?
另外,如何在一行中打印所有内容? (缩小内容)这可能吗?
我的解决方案
我必须创建自己的类(我真的改变了FlatFileItemWriter SpringBatch类,它是here
输出:具有一行JSON数组内容的文件。 谢谢!
答案 0 :(得分:0)
从ItemProcessor
返回每个项目的单个json@Component("jSONObjectProcessor")
public class JSONObjectProcessor implements ItemProcessor<Object, String> {
private Gson gson = new Gson();
@Override
public String process(Object item) throws Exception {
return gson.toJson(item);
}
}
创建页眉和页脚回调。基本上它们将分别用于启动和关闭数组。
public class JSONHeaderFooterCallBack implements FlatFileHeaderCallback, FlatFileFooterCallback{
@Override
public void writeHeader(Writer writer) throws IOException {
writer.write("[" + System.getProperty("line.separator"));
}
@Override
public void writeFooter(Writer writer) throws IOException {
writer.write("]");
}
}
将回调与FlatFileItemWriter
相关联FlatFileItemWriter<String> writer = new FlatFileItemWriter<String>();
//Setting header and footer.
JSONHeaderFooterCallBack headerFooterCallback = new JSONHeaderFooterCallBack();
writer.setHeaderCallback(headerFooterCallback);
writer.setFooterCallback(headerFooterCallback);
writer.setResource(new FileSystemResource(System.getProperty("user.dir") + "/output.json"));
现在你可以使用&#34; writer&#34;将所有记录作为json数组写入文件。 的 ---更新 - 强> 使用CustomLineAggregator在每条记录的末尾添加逗号:
public class CustomLineAggregator<String> implements LineAggregator<String> {
@Override
public String aggregate(String item) {
return item+",";
}
}