下面有一个复杂的JSON。我正在使用FlatFileItemReader阅读它。如何使用我自定义的ComplexJsonRecordSeparatorPolicy忽略最后一行"]"?
[
{"firstName":"Tom", "lastName":"Cruise"},
{"firstName":"Bruce", "lastName":"Willis"},
{"firstName":"Liam", "lastName":"Neeson"}
]
我的ComplexJsonRecordSeparatorPolicy如下所示。当我有"]"这个班是成功的。在第4行但是,当只提供"]"时,它会抛出一个错误在第5行,因为我的后处理器删除了行而不是忽略它。
public class ComplexJsonRecordSeparatorPolicy extends JsonRecordSeparatorPolicy {
@Override
public boolean isEndOfRecord(String line) {
return StringUtils.countOccurrencesOf(line, "{") == StringUtils.countOccurrencesOf(line, "}")
&& (line.trim().endsWith("}") || line.trim().endsWith(",") || line.trim().endsWith("]"));
}
@Override
public String postProcess(String record) {
if (record.startsWith("["))
record = record.substring(1);
if ((record.endsWith("]") || record.endsWith(",")))
record = record.substring(0, record.length() - 1);
return super.postProcess(record);
}
}
答案 0 :(得分:2)
我为这个创建了一个小例子。请看一下,让我知道你的想法
https://github.com/bigzidane/spring-batch-jsonListItem-reader
有关更多信息,我创建了一个Reader,用于将JSON解析为List,然后通过" classToBound'将每个条目映射到POJO。然后按照每个遵循Spring Batch标准返回每个。
该示例将Json文件作为
[
{
"name": "zidane",
"nation": "france"
},
{
"name": "ronaldo",
"nation": "brazil"
},
{
"name": "marcelo",
"nation": "brazil"
}
]
作业配置
<job id="exampleJsonReaderJob" xmlns="http://www.springframework.org/schema/batch">
<step id="stepId">
<tasklet>
<chunk reader="exampleJsonReader" writer="exampleWriter" processor="exampleProcessor" commit-interval="5" />
</tasklet>
</step>
</job>
读者
<bean id="exampleJsonReader" class="com.itservicesdepot.example.springbatch.jsonreader.reader.JsonFileListItemReader" scope="step">
<property name="resource" value="classpath:soccers.json" />
<property name="classToBound" value="com.itservicesdepot.example.springbatch.jsonreader.model.SoccerJsonEntry" />
</bean>
处理器和写入器只是正常的。
在读者中,有一个属性&#34; classToBound&#34;,这是Pojo,它是Json列表中带有项目的顶部地图。