Pretvaranje JSON-a u CSV u Javi

1. Uvod

U ovom kratkom vodiču vidjet ćemo kako koristiti Jackson za pretvaranje JSON-a u CSV i obrnuto.

Dostupne su alternativne knjižnice, poput klase CDL iz org.json, ali ovdje ćemo se usredotočiti samo na Jackson knjižnicu.

Nakon što pogledamo naš primjer strukture podataka, upotrijebit ćemo kombinaciju ObjectMapper i CSVMapper za pretvorbu između JSON-a i CSV-a.

2. Ovisnosti

Dodajmo ovisnost za Jackson CSV formatter podataka:

 com.fasterxml.jackson.dataformat jackson-dataformat-csv 2.11.1 

Uvijek možemo pronaći najnoviju verziju ove ovisnosti o Maven Central-u.

Također ćemo dodati ovisnost za temeljnu Jackson vezu podataka:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Opet, možemo pronaći najnoviju verziju ove ovisnosti o Maven Central.

3. Struktura podataka

Prije nego što ponovno formatiramo JSON dokument u CSV, moramo razmotriti koliko dobro će se naš model podataka mapirati između dva formata.

Dakle, prvo razmotrimo koje podatke podržavaju različiti formati:

  • Koristimo JSON za predstavljanje različitih objektnih struktura, uključujući one koje sadrže nizove i ugniježđene objekte
  • CSV koristimo za predstavljanje podataka s popisa objekata, pri čemu se svaki objekt s popisa pojavljuje u novom retku

To znači da ako naš JSON dokument ima niz objekata, možemo svaki objekt preformatirati u novi redak naše CSV datoteke. Dakle, kao primjer, upotrijebimo JSON dokument koji sadrži sljedeći popis predmeta iz narudžbe:

[{"item": "No. 9 Zupčanici", "količina": 12, "unitPrice": 1.23}, {"item": "Widget (10 mm)", "količina": 4, "unitPrice": 3.45} ]

Kao zaglavlja stupaca koristit ćemo imena polja iz JSON dokumenta i preformatirati ih u sljedeću CSV datoteku:

artikl, količina, jedinicaCijena "Br. 9 lančanika", 12,1,23 "Widget (10 mm)", 4,3,45

4. Pročitajte JSON i napišite CSV

Prvo, koristimo Jacksonovo ObjectMapper čitati naš primjer JSON dokumenta u stablu JsonNode objekti:

JsonNode jsonTree = novi ObjectMapper (). ReadTree (nova Datoteka ("src / main / resources / orderLines.json"));

Dalje, izradimo a CsvSchema. To određuje zaglavlja stupaca, vrste i slijed stupaca u CSV datoteci. Da bismo to učinili, kreiramo Graditelj CsvSchema i postavite zaglavlja stupaca da odgovaraju nazivima polja JSON:

Graditelj csvSchemaBuilder = CsvSchema.builder (); JsonNode firstObject = jsonTree.elements (). Next (); firstObject.fieldNames (). forEachRemaining (fieldName -> {csvSchemaBuilder.addColumn (fieldName);}); CsvSchema csvSchema = csvSchemaBuilder.build (). WithHeader ();

Zatim kreiramo CsvMapper s našim CsvSchema, i na kraju, pišemo jsonTree u našu CSV datoteku:

CsvMapper csvMapper = novi CsvMapper (); csvMapper.writerFor (JsonNode.class) .with (csvSchema) .writeValue (nova datoteka ("src / main / resources / orderLines.csv"), jsonTree);

Kada pokrenemo ovaj uzorak koda, naš se primjer JSON dokumenta pretvara u očekivanu CSV datoteku.

5. Pročitajte CSV i napišite JSON

A sada, poslužimo se Jacksonovim CsvMapper za čitanje naše CSV datoteke u Popis od Linija narudžbe predmeta. Da bismo to učinili, prvo stvorimo Linija narudžbe razred kao jednostavan POJO:

javna klasa OrderLine {stavka privatnog niza; privatna int količina; privatna BigDecimalna jedinicaPrice; // Konstruktori, getteri, postavljači i toString}

Koristit ćemo zaglavlja stupaca u CSV datoteci za definiranje našeg CsvSchema. Zatim, koristimo CsvMapper za čitanje podataka iz CSV-a u a MappingIterator od Linija narudžbe objekti:

CsvSchema orderLineSchema = CsvSchema.emptySchema (). WithHeader (); CsvMapper csvMapper = novi CsvMapper (); MappingIterator orderLines = csvMapper.readerFor (OrderLine.class) .with (orderLineSchema) .readValues ​​(nova datoteka ("src / main / resources / orderLines.csv"));

Dalje ćemo koristiti MappingIterator dobiti a Popis od Linija narudžbe predmeta. Zatim koristimo Jacksonovu ObjectMapper da biste spisak zapisali kao JSON dokument:

novi ObjectMapper () .configure (SerializationFeature.INDENT_OUTPUT, true) .writeValue (nova datoteka ("src / main / resources / orderLinesFromCsv.json"), orderLines.readAll ());

Kada pokrenemo ovaj uzorak koda, naša se primjer CSV datoteka pretvara u očekivani JSON dokument.

6. Konfiguriranje formata CSV datoteke

Upotrijebimo neke Jacksonove bilješke za prilagodbu formata CSV datoteke. Promijenit ćemo 'artikal' naslov kolone do 'Ime', 'količina' naslov kolone prema 'računati', uklonite 'jedinična cijena' stupac i napravite 'računati' prvi stupac.

Dakle, naša očekivana CSV datoteka postaje:

count, naziv 12, "Broj 9 lančanika" 4, "Widget (10 mm)"

Stvorit ćemo novu apstraktnu klasu za definiranje potrebnog formata za CSV datoteku:

@JsonPropertyOrder ({"count", "name"}) javna apstraktna klasa OrderLineForCsv {@JsonProperty ("name") private String item; @JsonProperty ("count") privatna int količina; @JsonIgnore private BigDecimal unitPrice; }

Zatim koristimo svoj OrderLineForCsv razred za stvaranje a CsvSchema:

CsvMapper csvMapper = novi CsvMapper (); CsvSchema csvSchema = csvMapper .schemaFor (OrderLineForCsv.class) .withHeader (); 

Također koristimo OrderLineForCsv kao Jackson Mixin. To Jacksonu govori da koristi napomene koje smo dodali u OrderLineForCsv razreda kada obrađuje Linija narudžbe objekt:

csvMapper.addMixIn (OrderLine.class, OrderLineForCsv.class); 

Konačno, koristimo ObjectMapper čitati naš JSON dokument u Linija narudžbe niz i koristite naš csvMapper da ovo zapišem u CSV datoteku:

OrderLine [] orderLines = new ObjectMapper () .readValue (nova datoteka ("src / main / resources / orderLines.json"), OrderLine []. Klasa); csvMapper.writerFor (OrderLine []. class) .with (csvSchema) .writeValue (nova datoteka ("src / main / resources / orderLinesReformated.csv"), orderLines); 

Kada pokrenemo ovaj uzorak koda, naš se primjer JSON dokumenta pretvara u očekivanu CSV datoteku.

7. Zaključak

U ovom smo brzom vodiču naučili kako čitati i pisati CSV datoteke pomoću Jackson knjižnice formata podataka. Također smo pogledali nekoliko opcija konfiguracije koje nam pomažu da svoje podatke izgledamo onako kako želimo.

Kao i uvijek, kod se može pronaći na GitHub-u.