【发布时间】:2020-09-02 17:49:14
【问题描述】:
我的目标是使用 Spring Batch 读取一个非常复杂的 JSON。下面是示例 JSON。
{
"order-info" : {
"order-number" : "Test-Order-1"
"order-items" : [
{
"item-id" : "4144769310"
"categories" : [
"ABCD",
"DEF"
],
"item_imag" : "http:// "
"attributes: {
"color" : "red"
},
"dimensions" : {
},
"vendor" : "abcd",
},
{
"item-id" : "88888",
"categories" : [
"ABCD",
"DEF"
],
.......
我知道我需要创建一个自定义 ItemReader 来解析这个 JSON。 请给我一些指示。我真是一头雾水。
我现在不使用 CustomItemReader。我正在使用 Java POJO。我的 JsonItemReader 如下:
@Bean
public JsonItemReader<Trade> jsonItemReader() {
ObjectMapper objectMapper = new ObjectMapper();
JacksonJsonObjectReader<Trade> jsonObjectReader =
new JacksonJsonObjectReader<>(Trade.class);
jsonObjectReader.setMapper(objectMapper);
return new JsonItemReaderBuilder<Trade>()
.jsonObjectReader(jsonObjectReader)
.resource(new ClassPathResource("search_data_1.json"))
.name("tradeJsonItemReader")
.build();
}
我现在得到的例外是:
java.lang.IllegalStateException:Json 输入流必须以 Json 对象数组开头
从这个论坛的类似帖子中,我了解到我需要使用 JsonObjectReader。 “您可以实现它来读取单个 json 对象并将其与 JsonItemReader 一起使用(在构造时或使用 setter)”。
我怎样才能在@构造时间或使用 setter 时做到这一点?请分享一些相同的代码sn-p。
MultiResourceItemReader 的委托仍应为 JsonItemReader。您只需要使用带有 JsonItemReader 的自定义 JsonObjectReader 而不是 JacksonJsonObjectReader。从视觉上看,这将是:MultiResourceItemReader -- 委托给 --> JsonItemReader -- 使用 --> 您的自定义 JsonObjectReader。
你能分享一下上面的代码sn-p吗?
【问题讨论】:
-
在您的案例中,哪个 JSON 片段对应于一个项目?你有一个代表一个项目的类吗?在 Spring Batch 工作之外,您将如何做到这一点?
-
@MahmoudBenHassine:我改变了策略……我没有使用 CustomItemReader。我现在正在使用 POJO。我现在确实有一个代表一个项目的类。现在我收到一个非常奇怪但基本的错误,上面写着 - “java.lang.IllegalStateException:Json 输入流必须以 Json 对象数组开头”。我在您给出的其他帖子中看到过-“您只需要使用带有 JsonItemReader 的自定义 JsonObjectReader 而不是 JacksonJsonObjectReader”。请你举一个同样的例子。我也在修改我的帖子。
-
Spring Batch 提供的 JsonItemReader 期望 json 输入是一个项目数组,参见它的javadoc。如果您的输入不是数组,则需要自定义阅读器。不幸的是,我没有这方面的例子。
标签: json jackson spring-batch unmarshalling