如何使用 Spring 批处理将 DB 的输出漂亮地打印到 JSON 文件?

How to pretty print the output from DB to a JSON file using Spring batch?

我已经实现 JsonFileItemWriter 将数据从数据库写入文件作为 json 结构。但是我没有看到漂亮打印 json.

的选项

以下示例显示如何定义 JsonFileItemWriter:

@Bean
public JsonFileItemWriter<Trade> jsonFileItemWriter() {
   return new JsonFileItemWriterBuilder<Trade>()
                 .jsonObjectMarshaller(new JacksonJsonObjectMarshaller<>())
                 .resource(new ClassPathResource("trades.json"))
                 .name("tradeJsonFileItemWriter")
                 .build();
}

实际输出:

[
{name="abc", id="1"},
{name="abcd", id="2"}
]

预期:

[
  {
    name="abc", 
    id="1"
  },
  {
    name="abcd", 
    id="2"
  }
]

因为我们没有任何选项可以将漂亮的打印添加到默认 JacksonJsonObjectMarshaller 我已经实现了我自己的 JacksonJsonObjectMarshaller 并向它添加了漂亮的打印选项。

  public String marshal(T item) {
    try {
      ObjectWriter objectWriter = objectMapper.writer().withDefaultPrettyPrinter();
      return objectWriter.writeValueAsString(item);
    } catch (JsonProcessingException e) {
      throw new ItemStreamException("Unable to marshal object " + item + " to Json", e);
    }
  }

另一个选项:

使用漂亮的打印选项创建新的 ObjectMapper,然后将其传递给 JacksonJsonObjectMarshaller

ObjectMapper objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
return new JsonFileItemWriterBuilder<Trade>()
                     .jsonObjectMarshaller(new JacksonJsonObjectMarshaller<>(objectMapper))
                     .resource(new ClassPathResource("trades.json"))
                     .name("tradeJsonFileItemWriter")
                     .build();