Приведите CSV-файл в JSON, используя RxJava2 - PullRequest
0 голосов
/ 02 октября 2019

[ОБНОВЛЕНО] ПриветМне нужно преобразовать содержимое файла CSV в JSON, отображаемый классом Java, используя RxJava2. Так, например, CSV выглядит следующим образом:

1,John,Smith

И класс Пользователь Java включает в себя свойства

Long id;
String name;
String surname;

Однако я не эксперт по RxJava2Я пытаюсь со следующим:

vertx.fileSystem().rxReadFile("/home/user/file.csv")

        .map(buffer -> buffer.toString("UTF-8"))
        .map(n -> n.replace(","," "))
        .map(JsonObject::new)
        .map(json -> json.mapTo(User.class))
        .subscribe(
                content -> System.out.println("Content: " + content),
                err -> System.out.println("Cannot read the file: " + err.getMessage())
        );

Однако кажется, что я на неправильном пути:

Failed to decode: Cannot deserialize instance of `java.util.LinkedHashMap` out of VALUE_NUMBER_INT token

Есть идеи, как добиться этого, просто используя преобразования RxJava2? Спасибо

1 Ответ

1 голос
/ 02 октября 2019

Вы смотрите на это совершенно неправильно. Между CSV и JSON нет автоматического / магического преобразования. Если вы хотите сгенерировать объект User из предоставленного вами CSV, вы можете использовать следующий код:

vertx.fileSystem().rxReadFile("/home/lbulic/file.csv")
            .map(buffer -> buffer.toString("UTF-8"))
            .map(n -> n.split(","))
            .map(data -> new User(Long.parseLong(data[0]), data[1], data[2]))
            .subscribe(content -> System.out.println("Content: " + content),
                    err -> System.out.println("Cannot read the file: " + err.getMessage()));

Вам понадобится конструктор для объекта User, а также метод toString для правильного выполнения этого. Если вы хотите использовать JSON вместо объекта User, то простой способ - просто преобразовать сгенерированный объект User в JSON с помощью Jackson.

rtx.fileSystem().rxReadFile("/home/lbulic/file.csv")
            .map(buffer -> buffer.toString("UTF-8"))
            .map(n -> n.split(","))
            .map(data -> new User(Long.parseLong(data[0]), data[1], data[2]))
            .map(user -> Json.encode(user))
            .subscribe(content -> System.out.println("Content: " + content),
                    err -> System.out.println("Cannot read the file: " + err.getMessage()));

Чтобы это работало, вам также понадобятся методы получения и установки для объекта User.

Если вам нужно прямое преобразование из CSV в JSON, вам нужно изменить текущую структуру вашего CSV на что-то вроде этого и включить в нее добавочную зависимость.

CSV:

id,name,surname
1,John,Smith

Зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
    <version>2.9.9</version>
</dependency>

Код:

CsvSchema csvSchema = CsvSchema.builder().setUseHeader(true).build();
    CsvMapper csvMapper = new CsvMapper();

    vertx.fileSystem().rxReadFile("/home/lbulic/file.csv")
            .map(buffer -> buffer.toString("UTF-8"))
            .map(input -> csvMapper.readerFor(Map.class).with(csvSchema).readValues(input).readAll())
            .map(list -> list.stream().map(Json::encode).collect(Collectors.toList()))
            .subscribe(users -> {
                users.forEach(System.out::println);
            }, err -> System.out.println("Cannot read the file: " + err.getMessage()));
...