如何在Spring批处理中阅读复杂的JSON?

时间:2018-03-27 15:03:22

标签: json spring spring-batch batch-processing

下面有一个复杂的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);
    }
}

1 个答案:

答案 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列表中带有项目的顶部地图。