gpt4 book ai didi

java - 使用 spring batch 读取复杂的 json 文件

转载 作者:行者123 更新时间:2023-11-30 08:16:01 28 4
gpt4 key购买 nike

我有一个复杂的 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"}]}]}
]}

我想分开读每一行(一个人)

所以我的spring batch配置是这样的

<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" />

映射器类看起来像

    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"}

而且效果很好……我一个一个地读了每个人

非常感谢

最佳答案

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

  1. 编写您自己的记录分隔符,忽略包装人员元素/行。
  2. 在读取文件之前的一个步骤中编辑文件,使用类似 sed 命令的方式删除包装行。

如果选择选项 2,则可以在实际处理它的步骤之前的步骤中通过 SystemCommandTasklet 执行它。

关于java - 使用 spring batch 读取复杂的 json 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28563513/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com