A JSON konvertálása CSV formátumba Java-ban

1. Bemutatkozás

Ebben a rövid bemutatóban megtudhatjuk, hogyan lehet Jackson felhasználásával konvertálni a JSON-t CSV -vé és fordítva.

Vannak alternatív könyvtárak, mint például az org.json CDL osztálya, de itt csak a Jackson könyvtárra koncentrálunk.

Miután megvizsgáltuk az adatstruktúránkat, ezek kombinációját fogjuk használni ObjectMapper és a CSVMapper a JSON és a CSV közötti konvertáláshoz.

2. Függőségek

Tegyük hozzá a Jackson CSV-adatformázó függőségét:

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

Mindig megtalálhatjuk ennek a függőségnek a legújabb verzióját a Maven Central-tól.

Hozzáadjuk a Jackson alapvető adatbázisának függőségét is:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Ismét megtalálhatjuk a Maven Central függőségének legfrissebb verzióját.

3. Adatszerkezet

Mielőtt újraformáznánk a JSON dokumentumot CSV formátumra, meg kell fontolnunk, hogy az adatmodellünk mennyire fogja leképezni a két formátumot.

Tehát először mérlegeljük, hogy a különböző formátumok milyen adatokat támogatnak:

  • A JSON-t sokféle objektumstruktúra képviseletére használjuk, beleértve azokat is, amelyek tömböket és beágyazott objektumokat tartalmaznak
  • A CSV-t használjuk egy objektumlista adatainak ábrázolásához, a lista minden objektuma új sorban jelenik meg

Ez azt jelenti, hogy ha JSON dokumentumunkban tömb objektum található, akkor minden egyes objektumot átformázhatunk egy új sorba a CSV fájlunkba. Tehát használjunk példaként egy JSON-dokumentumot, amely a megrendelés következő elemlistáját tartalmazza:

[{"item": "No. 9 lánckerék", "mennyiség": 12, "unitPrice": 1.23}, {"item": "Widget (10mm)", "mennyiség": 4, "unitPrice": 3.45} ]

A JSON dokumentum mezőneveit oszlopfejlécként fogjuk használni, és formázza át a következő CSV fájlba:

"9-es lánckerék" ár, 12,1,23 "Widget (10 mm)", 4,3,45

4. Olvassa el a JSON-t és írja a CSV-t

Először a Jacksonét használjuk ObjectMapper hogy elolvassa a JSON dokumentum példáját egy fába JsonNode tárgyak:

JsonNode jsonTree = new ObjectMapper (). ReadTree (új fájl ("src / main / resources / orderLines.json"));

Ezután hozzunk létre egy CsvSchema. Ez határozza meg az oszlopfejléceket, -típusokat és oszlopok sorrendjét a CSV-fájlban. Ehhez létrehozunk egy CsvSchema Builder és állítsa be az oszlopfejléceket a JSON mezőnevekhez:

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

Ezután létrehozunk egy CsvMapper velünk CsvSchema, végül pedig megírjuk a jsonTree a CSV fájlunkba:

CsvMapper csvMapper = új CsvMapper (); csvMapper.writerFor (JsonNode.class) .with (csvSchema) .writeValue (új Fájl ("src / main / resources / orderLines.csv"), jsonTree);

Ha futtatjuk ezt a mintakódot, akkor a JSON-példánk a várt CSV-fájlba konvertálódik.

5. Olvassa el a CSV-t és írja a JSON-t

Most használjuk Jacksonét CsvMapper hogy a CSV fájlunkat a Lista nak,-nek OrderLine tárgyakat. Ehhez először létrehozzuk a OrderLine osztály, mint egyszerű POJO:

public class OrderLine {private String item; privát int mennyiség; privát BigDecimal unitPrice; // Konstruktorok, Getters, Setters és toString}

A CSV-fájl oszlopfejléceit használjuk a fájlok meghatározásához CsvSchema. Azután, használjuk a CsvMapper hogy olvassa el az adatokat a CSV-ből ba be MappingIterator nak,-nek OrderLine tárgyak:

CsvSchema orderLineSchema = CsvSchema.emptySchema (). WithHeader (); CsvMapper csvMapper = új CsvMapper (); MappingIterator orderLines = csvMapper.readerFor (OrderLine.class) .with (orderLineSchema) .readValues ​​(új fájl ("src / main / resources / orderLines.csv"));

Ezután a MappingIterator hogy a Lista nak,-nek OrderLine tárgyakat. Ezután a Jacksonét használjuk ObjectMapper hogy a listát JSON dokumentumként írja ki:

új ObjectMapper () .configure (SerializationFeature.INDENT_OUTPUT, true) .writeValue (új fájl ("src / main / resources / orderLinesFromCsv.json"), orderLines.readAll ());

Amikor futtatjuk ezt a mintakódot, a CSV-példapéldánk a várt JSON-dokumentummá konvertálódik.

6. A CSV fájlformátum beállítása

Használjuk Jackson néhány kommentárját a CSV fájl formátumának beállításához. Megváltoztatjuk a 'tétel' oszlop címsor 'név', a 'Mennyiség' oszlop címsor 'számol', távolítsa el a 'egységár' oszlopot, és készítse el 'számol' az első oszlop.

Tehát a várható CSV-fájl:

gróf, 12. név, "9. sz. lánckerék" 4, "Widget (10 mm)"

Létrehozunk egy új absztrakt osztályt a CSV-fájl szükséges formátumának meghatározásához:

@JsonPropertyOrder ({"count", "név"}) public abstract class OrderLineForCsv {@JsonProperty ("name") private String item; @JsonProperty ("count") privát int mennyiség; @JsonIgnore BigDecimal private privatePrice; }

Aztán használjuk a mi OrderLineForCsv osztály létrehozásához CsvSchema:

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

Használjuk a OrderLineForCsv mint Jackson Mixin. Ez arra utasítja Jackson-t, hogy használja a feliratokat, amelyeket hozzáadtunk a OrderLineForCsv osztály, amikor egy OrderLine tárgy:

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

Végül egy ObjectMapper hogy olvassa el JSON dokumentumunkat egy OrderLine tömb, és használja a mi csvMapper hogy ezt CSV fájlba írja:

OrderLine [] orderLines = new ObjectMapper () .readValue (új Fájl ("src / main / resources / orderLines.json"), OrderLine []. Osztály); csvMapper.writerFor (OrderLine []. osztály) .with (csvSchema) .writeValue (új Fájl ("src / main / resources / orderLinesReformated.csv"), orderLines); 

Ha futtatjuk ezt a mintakódot, akkor a JSON-példánk a várt CSV-fájlba konvertálódik.

7. Következtetés

Ebben a gyors bemutatóban megtanultuk, hogyan kell CSV fájlokat írni és írni a Jackson adatformátum könyvtár segítségével. Megvizsgáltunk néhány konfigurációs lehetőséget is, amelyek segítenek abban, hogy az adataink a kívánt módon nézzenek ki.

Mint mindig, a kód megtalálható a GitHubon.