【问题标题】:How to use Flux to write Json Pojo to a CSV如何使用 Flux 将 Json Pojo 写入 CSV
【发布时间】:2021-04-06 21:02:43
【问题描述】:

以下函数将检索字符串列表。在合并过程中,而不是打印输出,我想将输出写入 CSV 文件。

List<Mono<Device>> list1 = page.get().map(device -> webClient.post()
                .uri(uri)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
                .body(Mono.just("{ \"mac\": \"" + device.getData()  ), String.class)
                .attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId("xxxx"))
                .retrieve()
                .bodyToMono(Device.class)).collect(Collectors.toList());

        Flux<Device> mergedMonos = Flux.fromIterable(list1).flatMapSequential(Function.identity());
        mergedMonos.doOnNext(System.out::println)
                .subscribe();


public class Device {
 @JsonProperty("ip")
 private String ip;
 @JsonProperty("macAddress")
 private String macAddress;
 @JsonProperty("vendor")
 private String vendor;

如何将设备 (Json) 数据写入 CSV 文件?

谢谢

【问题讨论】:

  • 一次一个 JSON 字符串?为什么不将其保存到*.json 文件中?
  • 只有一个请求以外的服务。

标签: java spring spring-boot spring-webclient


【解决方案1】:

结帐Converting JSON to CSV in Java

您可以利用 jackson 库将 java 对象转换为 csv。在依赖项中添加:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>

然后在代码中:

ObjectMapper mapper = new ObjectMapper();
Flux<Device> mergedMonos = 
Flux.fromIterable(list1).flatMapSequential(Function.identity());
List<JsonNode> nodes = mergedMonos
    .collectList()
    .map(mapper::valueToTree)
    .subscribe(list -> {
        Builder csvSchemaBuilder = CsvSchema.builder();
        JsonNode firstObject = list.elements().next();
        firstObject.fieldNames().forEachRemaining(fieldName -> {csvSchemaBuilder.addColumn(fieldName);} );
        CsvSchema csvSchema = csvSchemaBuilder.build().withHeader();
        CsvMapper csvMapper = new CsvMapper();
        csvMapper.writerFor(JsonNode.class)
          .with(csvSchema)
          .writeValue(new File("output.csv"), list);
    });

【讨论】:

  • 谢谢塔希尔。为什么需要使用两次 valueToTree ?
  • @angus 首先将单个设备对象转换为树,然后将树列表转换为树。再次查看代码,我发现第一个 valueToTree 是多余的,因为它将在第二个中覆盖。
猜你喜欢
  • 2017-05-21
  • 2021-06-21
  • 2017-09-02
  • 2016-01-18
  • 2020-05-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多