Konvertieren von JSON in CSV in Java

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, wie Sie mit Jackson JSON in CSV konvertieren und umgekehrt.

Es gibt alternative Bibliotheken wie die CDL-Klasse von org.json, aber wir konzentrieren uns hier nur auf die Jackson-Bibliothek.

Nachdem wir bei unserem Beispiel Datenstruktur angesehen haben, werden wir eine Kombination aus verwenden ObjectMapper und CSVMapper zu konvertieren zwischen JSON und CSV.

2. Abhängigkeiten

Fügen wir die Abhängigkeit für den Jackson CSV-Datenformatierer hinzu:

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

Wir können immer die neueste Version dieser Abhängigkeit von Maven Central finden.

Wir werden auch die Abhängigkeit für die Kerndatenbank von Jackson hinzufügen:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Auch hier finden wir die neueste Version dieser Abhängigkeit von Maven Central.

3. Datenstruktur

Bevor wir ein JSON-Dokument in CSV umformatieren, müssen wir prüfen, wie gut unser Datenmodell zwischen den beiden Formaten abgebildet wird.

Betrachten wir zunächst, welche Daten die verschiedenen Formate unterstützen:

  • Wir verwenden JSON, um eine Vielzahl von Objektstrukturen darzustellen, einschließlich solcher, die Arrays und verschachtelte Objekte enthalten
  • Wir verwenden CSV, um Daten aus einer Liste von Objekten darzustellen, wobei jedes Objekt aus der Liste in einer neuen Zeile angezeigt wird

Dies bedeutet, dass wir jedes Objekt in eine neue Zeile unserer CSV-Datei umformatieren können, wenn unser JSON-Dokument ein Array von Objekten enthält. Verwenden wir als Beispiel ein JSON-Dokument, das die folgende Liste von Artikeln aus einer Bestellung enthält:

[ { "item" : "No. 9 Sprockets", "quantity" : 12, "unitPrice" : 1.23 }, { "item" : "Widget (10mm)", "quantity" : 4, "unitPrice" : 3.45 } ]

Wir verwenden die Feldnamen aus dem JSON-Dokument als Spaltenüberschriften und formatieren sie in die folgende CSV-Datei neu:

item,quantity,unitPrice "No. 9 Sprockets",12,1.23 "Widget (10mm)",4,3.45

4. Lesen Sie JSON und schreiben Sie CSV

Zunächst verwenden wir Jacksons ObjectMapper , um unser Beispiel-JSON-Dokument in einen Baum von JsonNode- Objekten einzulesen :

JsonNode jsonTree = new ObjectMapper().readTree(new File("src/main/resources/orderLines.json"));

Als nächstes erstellen wir ein CsvSchema . Dies bestimmt die Spaltenüberschriften, -typen und -sequenzen der Spalten in der CSV-Datei. Zu diesem Zweck erstellen wir einen CsvSchema Builder und legen die Spaltenüberschriften so fest, dass sie mit den JSON-Feldnamen übereinstimmen:

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

Dann erstellen wir mit unserem CsvSchema einen CsvMapper und schreiben schließlich den jsonTree in unsere CSV-Datei :

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

Wenn wir diesen Beispielcode ausführen, wird unser Beispiel-JSON-Dokument in die erwartete CSV-Datei konvertiert.

5. Lesen Sie CSV und schreiben Sie JSON

Verwenden wir nun Jacksons CsvMapper , um unsere CSV-Datei in eine Liste von OrderLine- Objekten einzulesen . Dazu erstellen wir zunächst die OrderLine- Klasse als einfaches POJO:

public class OrderLine { private String item; private int quantity; private BigDecimal unitPrice; // Constructors, Getters, Setters and toString }

Wir werden die Spaltenüberschriften in der CSV-Datei verwenden, um unser CsvSchema zu definieren . Anschließend verwenden wir den CsvMapper , um die Daten aus der CSV in einen MappingIterator von OrderLine- Objekten zu lesen :

CsvSchema orderLineSchema = CsvSchema.emptySchema().withHeader(); CsvMapper csvMapper = new CsvMapper(); MappingIterator orderLines = csvMapper.readerFor(OrderLine.class) .with(orderLineSchema) .readValues(new File("src/main/resources/orderLines.csv"));

Als Nächstes verwenden wir den MappingIterator , um eine Liste der OrderLine- Objekte abzurufen . Dann verwenden wir Jacksons ObjectMapper , um die Liste als JSON-Dokument zu schreiben:

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

Wenn wir diesen Beispielcode ausführen, wird unsere Beispiel-CSV-Datei in das erwartete JSON-Dokument konvertiert.

6. Konfigurieren des CSV-Dateiformats

Verwenden wir einige von Jacksons Anmerkungen, um das Format der CSV-Datei anzupassen. Wir ändern die Spaltenüberschrift "Artikel" in "Name" , die Spaltenüberschrift "Menge" in "Anzahl" , entfernen die Spalte "Einheitspreis" und machen "Anzahl" zur ersten Spalte.

Unsere erwartete CSV-Datei lautet also:

count,name 12,"No. 9 Sprockets" 4,"Widget (10mm)"

Wir erstellen eine neue abstrakte Klasse, um das erforderliche Format für die CSV-Datei zu definieren:

@JsonPropertyOrder({ "count", "name" }) public abstract class OrderLineForCsv { @JsonProperty("name") private String item; @JsonProperty("count") private int quantity; @JsonIgnore private BigDecimal unitPrice; }

Anschließend verwenden wir unsere OrderLineForCsv- Klasse, um ein CsvSchema zu erstellen :

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

Wir verwenden OrderLineForCsv auch als Jackson Mixin. Dies weist Jackson an, die Anmerkungen zu verwenden, die wir der OrderLineForCsv- Klasse hinzugefügt haben, wenn sie ein OrderLine- Objekt verarbeitet:

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

Schließlich verwenden wir einen ObjectMapper , um unser JSON-Dokument in ein OrderLine- Array einzulesen , und verwenden unseren csvMapper , um dies in eine CSV-Datei zu schreiben:

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

Wenn wir diesen Beispielcode ausführen, wird unser Beispiel-JSON-Dokument in die erwartete CSV-Datei konvertiert.

7. Fazit

In diesem kurzen Tutorial haben wir gelernt, wie man CSV-Dateien mithilfe der Jackson-Datenformatbibliothek liest und schreibt. Wir haben uns auch einige Konfigurationsoptionen angesehen, mit denen wir unsere Daten so anzeigen können, wie wir es möchten.

Wie immer ist der Code auf GitHub zu finden.