Konverzia JSON na CSV v Jave

1. Úvod

V tomto krátkom tutoriáli sa dozvieme, ako pomocou Jacksona prevádzať JSON na CSV a naopak.

K dispozícii sú alternatívne knižnice, napríklad trieda CDL z org.json, ale tu sa zameriame iba na Jacksonovu knižnicu.

Potom, čo sme sa pozreli na našu vzorovú dátovú štruktúru, použijeme kombináciu ObjectMapper a CSVMapper na konverziu medzi JSON a CSV.

2. Závislosti

Pridajme závislosť formátovača údajov Jackson CSV:

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

Najnovšiu verziu tejto závislosti vždy nájdeme na serveri Maven Central.

Pridáme tiež závislosť pre jadro Jacksonovho databázového servera:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Opäť môžeme nájsť najnovšiu verziu tejto závislosti na Maven Central.

3. Štruktúra údajov

Pred preformátovaním dokumentu JSON na CSV musíme zvážiť, ako dobre bude náš dátový model mapovaný medzi týmito dvoma formátmi.

Najprv si teda zvážime, ktoré údaje rôzne formáty podporujú:

  • Používame JSON na reprezentáciu rôznych štruktúr objektov, vrátane tých, ktoré obsahujú polia a vnorené objekty
  • Používame CSV na reprezentáciu údajov zo zoznamu objektov, pričom každý objekt zo zoznamu sa zobrazuje v novom riadku

To znamená, že ak má náš dokument JSON pole objektov, môžeme každý objekt preformátovať na nový riadok nášho súboru CSV. Ako príklad teda použijeme dokument JSON, ktorý obsahuje nasledujúci zoznam položiek z objednávky:

[{"item": "No. 9 Sprockets", "number": 12, "unitPrice": 1,23}, {"item": "Widget (10 mm)", "množstvo": 4, "unitPrice": 3,45} ]

Názvy polí z dokumentu JSON použijeme ako hlavičky stĺpcov a preformátujeme ich na nasledujúci súbor CSV:

položka, množstvo, jednotka Cena "Ozubené koliesko č. 9", 12,1,23 "widget (10 mm)", 4,3,45

4. Prečítajte si JSON a napíšte CSV

Najprv použijeme Jacksonove ObjectMapper prečítať náš vzorový dokument JSON do stromu JsonNode objekty:

JsonNode jsonTree = nový ObjectMapper (). ReadTree (nový súbor ("src / main / resources / orderLines.json"));

Ďalej vytvoríme a CsvSchema. Toto určuje hlavičky stĺpcov, typy a postupnosť stĺpcov v súbore CSV. Za týmto účelom vytvoríme a CsvSchema Builder a nastavte hlavičky stĺpcov tak, aby sa zhodovali s názvami polí JSON:

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

Potom vytvoríme a CsvMapper s našim CsvSchemaa nakoniec napíšeme jsonTree do nášho súboru CSV:

CsvMapper csvMapper = nový CsvMapper (); csvMapper.writerFor (JsonNode.class) .with (csvSchema) .writeValue (nový súbor ("src / main / resources / orderLines.csv"), jsonTree);

Keď spustíme tento ukážkový kód, náš vzorový dokument JSON sa prevedie do očakávaného súboru CSV.

5. Prečítajte si CSV a napíšte JSON

Teraz použijeme Jacksona CsvMapper prečítať náš súbor CSV do formátu Zoznam z OrderLine predmety. Aby sme to dosiahli, najskôr vytvoríme OrderLine trieda ako jednoduchý POJO:

public class OrderLine {private String item; súkromné ​​množstvo; súkromná BigDecimal unitPrice; // Konštruktory, getre, setre a toString}

Na definovanie našich použijeme hlavičky stĺpcov v súbore CSV CsvSchema. Potom, používame CsvMapper načítať údaje z CSV do a MappingIterator z OrderLine objekty:

CsvSchema orderLineSchema = CsvSchema.emptySchema (). WithHeader (); CsvMapper csvMapper = nový CsvMapper (); MappingIterator orderLines = csvMapper.readerFor (OrderLine.class) .with (orderLineSchema) .readValues ​​(nový súbor ("src / main / resources / orderLines.csv"));

Ďalej použijeme MappingIterator získať a Zoznam z OrderLine predmety. Potom použijeme Jacksonove ObjectMapper vypísať zoznam ako dokument JSON:

new ObjectMapper () .configure (SerializationFeature.INDENT_OUTPUT, true) .writeValue (nový súbor ("src / main / resources / orderLinesFromCsv.json"), orderLines.readAll ());

Keď spustíme tento ukážkový kód, náš ukážkový súbor CSV sa prevedie na očakávaný dokument JSON.

6. Konfigurácia formátu súboru CSV

Použime niektoré Jacksonove anotácie na úpravu formátu súboru CSV. Zmeníme ‘Položka’ hlavička stĺpca do 'názov', „Množstvo“ hlavička stĺpca do „Počítať“, odstrániť 'jednotková cena' stĺpec a urobiť „Počítať“ prvý stĺpec.

Náš očakávaný súbor CSV sa teda stane:

počet, názov 12, "Ozubené koliesko č. 9" 4, "Widget (10 mm)"

Vytvoríme novú abstraktnú triedu na definovanie požadovaného formátu pre súbor CSV:

@JsonPropertyOrder ({"count", "name"}) verejná abstraktná trieda OrderLineForCsv {@JsonProperty ("name") súkromná položka reťazca; @JsonProperty („count“) súkromné ​​int množstvo; @JsonIgnore súkromná BigDecimal unitPrice; }

Potom použijeme náš OrderLineForCsv triedy na vytvorenie a CsvSchema:

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

Používame tiež OrderLineForCsv ako Jackson Mixin. Toto hovorí Jacksonovi, aby použil anotácie, ktoré sme pridali do súboru OrderLineForCsv triedy, keď spracúva OrderLine objekt:

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

Nakoniec použijeme ObjectMapper prečítať náš dokument JSON do formátu OrderLine pole a použite náš csvMapper napísať toto do súboru CSV:

OrderLine [] orderLines = nový ObjectMapper () .readValue (nový súbor ("src / main / resources / orderLines.json"), OrderLine []. Trieda); csvMapper.writerFor (OrderLine []. trieda). s (csvSchema) .writeValue (nový súbor ("src / main / resources / orderLinesReformated.csv"), orderLines); 

Keď spustíme tento ukážkový kód, náš vzorový dokument JSON sa prevedie do očakávaného súboru CSV.

7. Záver

V tomto rýchlom výučbe sme sa naučili čítať a zapisovať súbory CSV pomocou knižnice formátov údajov Jackson. Pozreli sme sa tiež na niekoľko možností konfigurácie, ktoré nám pomáhajú získať naše údaje tak, ako chceme.

Ako vždy, kód nájdete na GitHub.