Konwertowanie jsona do csv i zapisywanie do pliku

0

Mam jsona, z którego potrzebne dane wyciągam w taki sposób:

  ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(response3.toString());
        JsonNode items = node.get("items");
        JsonNode statistics = items.findValue("statistics");

Odpowiedź jaką otrzymuje to: {"commentCount":"17","dislikeCount":"9","favoriteCount":"0","likeCount":"213","viewCount":"5576"}

Następnie chcę to przekonwertować do csv i zapisać do pliku za pomocą:

 CsvSchema.Builder csvSchemaBuilder = CsvSchema.builder();
        JsonNode firstObject = statistics.elements().next();
        firstObject.fieldNames().forEachRemaining(csvSchemaBuilder::addColumn);
        CsvSchema csvSchema = csvSchemaBuilder.build().withHeader();

        final CsvMapper csvMapper = new CsvMapper();
        final CsvSchema schema = csvMapper.schemaFor(JsonNode.class);
        final String csv = csvMapper.writer(schema.withUseHeader(true)).writeValueAsString(new File("src/main/resources/orderLines.csv"));
        System.out.println(csv);

Wynik w konsoli jaki otrzymuję to: array,bigDecimal,bigInteger,binary,boolean,containerNode,double,float,floatingPointNumber,int,integralNumber,long,missingNode,nodeType,null,number,object,pojo,short,textual,valueNode
"C:\Users\Admin\Downloads\youtube\src\main\resources\orderLines.csv",,,,,,,,,,,,,,,,,,,,

Czy metoda z której korzystam jest niepoprawna czy powinnam inaczej do tego podejść? Moim celem jest przekonwertowanie tej części jsona do csv i zapisanie do pliku

1

Ustawiłaś mu jako format wyjściowy JsonNode, więc ten potraktował wszystkie metody zaczynające się na is i get jako pola.

Musisz zrobić sobie własną klasę z tymi polami, które masz w JSONie i podać ją jako porządany typ przy parsowaniu JSONa, jak i przy tworzeniu CSV.

0

@szatkus: Ok, ale czy dobrze, że użyłam ObjectMappera czy wcześniej powinnam inaczej wyciągać potrzebne wartości? Czy powinnam teraz to co otrzymuję przełożyć na klasę z polami?

1

Tak, możesz w kolejnym kroku użyc convertValue, żeby sobie przekonwertować JsonNode na swoją klasę.

0

@szatkus: Utworzyłam już nową klasę Video.class i sprawdziłam, że poprawnie wykonuje się te konwertowanie, jednak dalej mam problem z CsvMapperem i zwraca dziwne rzeczy:

ageGating,classInfo,contentDetails,empty,etag,factory,fileDetails,id,kind,liveStreamingDetails,localizations,monetizationDetails,player,processingDetails,projectDetails,recordingDetails,snippet,statistics,status,suggestions,topicDetails,unknownKeys
"C:\Users\Admin\Downloads\youtube\src\main\resources\orderLines.csv",,,,,,,,,,,,,,,,,,,,,

Mój kod:

  ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(response.toString());
        JsonNode items = node.get("items");
        JsonNode statistics = items.findValue("statistics");

        mapper.convertValue(statistics, Video.class);

        final CsvMapper csvMapper = new CsvMapper();
        final CsvSchema schema = csvMapper.schemaFor(Video.class);
        final String csv = csvMapper.writer(schema.withUseHeader(true)).writeValueAsString(new File("src/main/resources/orderLines.csv"));
        System.out.println(csv);
0
  1. Do obsługi JSONa użyłbym Googlowego Gsona, jest banalny w obsłudze.
  2. Jsona parsowałbym na jakąś klase modelową, klasę z danymi które są reprezentowane przez tego jsona. Przykład tu: https://mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/
  3. Obiekt tej klasy, parsowałbym na CSV i rezultat (prawodpodobnie String) zapisywałbym do pliku. Przykład tu: https://mkyong.com/java/how-to-export-data-to-csv-file-java/
1

Jesteś pewna, że używasz tego czego potrzebujesz?

final String csv = csvMapper.writer(schema.withUseHeader(true)).writeValueAsString(new File("src/main/resources/orderLines.csv"));

Jeśli chcesz zapisać do pliku to robisz: .writeValue(new File("src/main/resources/orderLines.csv"), statistics);
Jeśli chcesz je mieć jako String to .writeValueAsString(statistic);

1 użytkowników online, w tym zalogowanych: 0, gości: 1