弹簧批单输入线到多线输出

时间:2015-12-15 15:45:55

标签: java json spring-batch

我有一个json响应文件作为输入需要将其转换为csv。 输入文件包含超过1000行响应。每个响应都包含多个客户端信息。请求的输出是每行必须是一个客户信息

ex:一行输入

{"monitoringMessage":{"type":"SEED","messageId":"eaf2f4d1-ccaa-4ca2-baa3-130aceac9c48_5","messageTimestamp":"2015-12-11T09:31:48.040Z","inLanguage":"en-US","reference":"Duns_notif","notificationCount":1,"notifications":[{"organization":{"isExporter":false,"name":"xyz","age":"34"},{"organization":{"isExporter":false,"name":"abc","age":"40"}]}}

预期输出(csv格式):

xys,34
abc,40

任何人都可以使用Spring-batch建议吗?

1 个答案:

答案 0 :(得分:1)

首先,您需要阅读json文件。为此,您可以将FlatFileItemReader组合使用JsonLineMapperJsonRecordSeparatorPolicy

<bean class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="${input.file.location}"/>
    <property name="recordSeparatorPolicy">
        <bean class="org.springframework.batch.item.file.separator.JsonRecordSeparatorPolicy" />
    </property>
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.JsonLineMapper" />
    </property>
</bean>

然后您需要FlatFileItemWriter来编写csv文件。

<bean class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
    <property name="resource" value="${output.file.location}"></property>
    <property name="lineAggregator">
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
            <property name="delimiter" value=","></property>
            <property name="fieldExtractor" ref="fieldExtractor"></property>
        </bean>                                 
    </property>
</bean>

由于JsonLineMapper将返回Map,您需要ItemProcessor将此Map转换为具有您的属性(名称,年龄)的bean {39} ;让您使用BeanWrapperFieldExtractor作为lineAggregator;或者您可以使用FieldExtractor来获取索引的地图值。