用spring批处理读取复杂的json文件

时间:2015-02-17 14:19:55

标签: java json spring spring-batch

我有一个复杂的json文件(带有嵌套的json数组)结构,如下所示:

{"persons":[ 
{"id":"1", "firstName": "X", "lastName": "X", "infos": [{"address":[{"city": "X", "country": "X"}]}]},
{"id":"2", "firstName": "Y", "lastName": "Y", "infos": [{"address":[{"city": "Y", "country": "Y"}]}]}
]}

我想分别阅读每一行(一个人)

所以我的弹簧批配置就像这样

<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader"
    scope="step">
    <property name="resource" value="#{jobParameters[file]}" />
    <property name="recordSeparatorPolicy" ref="recordPolicy" />
    <property name="lineMapper" ref="lineMapper" />
</bean>

<bean id="lineMapper"
    class="com.batchs.personJob.PersonLineMapper">
    <property name="delegate" ref="lineMapperType" />
</bean>

<bean id="lineMapperType"
    class="org.springframework.batch.item.file.mapping.JsonLineMapper" />

<bean id="recordPolicy"
    class="org.springframework.batch.item.file.separator.JsonRecordSeparatorPolicy" />

mapper类看起来像

    public class PersonLineMapper implements LineMapper<Person> {
    private JsonLineMapper delegate;

    public mapLine(String line, int lineNumber) throws Exception {
        Map<String, Object> personAsMap = delegate.mapLine(line, lineNumber);
        Person person = new Person();
        // map fields
        return person ;
    }

    public void setDelegate(JsonLineMapper delegate) {
        this.delegate = delegate;
    }
}

问题是读者只读一行(所以一次提交),因为他在我的json文件中读取人员数组,就像整行一样,但我想读取而不是每行一行(一次一个人)

怎么做?

我尝试过这样一个简单的json文件:

  { "id": "1",
      "firstName": "X",
      "lastName": "X"}
  { "id": "2",
      "firstName": "Y",
      "lastName": "Y"}

它运作良好......我逐一阅读每个人

非常感谢

2 个答案:

答案 0 :(得分:2)

不幸的是,您有两种选择:

  1. 编写自己的记录分隔符,忽略包装人员元素/行。
  2. 在读取文件之前,先在步骤中编辑文件,然后使用sed命令删除该包装行。
  3. 如果选择选项2,则可以在实际处理选项之前的步骤中通过SystemCommandTasklet执行选项。

答案 1 :(得分:1)

另一种方法是通过转换步骤来运行文件以展平对象结构,因此您只需要一组People来处理。哪个应该没问题,除非你正在处理大文件。