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.