Conversione di JSON in CSV in Java

1. Introduzione

In questo breve tutorial vedremo come utilizzare Jackson per convertire JSON in CSV e viceversa.

Sono disponibili librerie alternative, come la classe CDL da org.json, ma qui ci concentreremo solo sulla libreria Jackson.

Dopo aver esaminato la nostra struttura dati di esempio, utilizzeremo una combinazione di ObjectMapper e CSVMapper per convertire tra JSON e CSV.

2. Dipendenze

Aggiungiamo la dipendenza per il formattatore di dati CSV di Jackson:

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

Possiamo sempre trovare la versione più recente di questa dipendenza su Maven Central.

Aggiungeremo anche la dipendenza per il database principale di Jackson:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Ancora una volta, possiamo trovare la versione più recente di questa dipendenza su Maven Central.

3. Struttura dei dati

Prima di riformattare un documento JSON in CSV, dobbiamo considerare quanto bene il nostro modello di dati verrà mappato tra i due formati.

Quindi, prima, consideriamo quali dati supportano i diversi formati:

  • Usiamo JSON per rappresentare una varietà di strutture di oggetti, comprese quelle che contengono array e oggetti nidificati
  • Usiamo CSV per rappresentare i dati da un elenco di oggetti, con ogni oggetto dell'elenco che appare su una nuova riga

Ciò significa che se il nostro documento JSON ha un array di oggetti, possiamo riformattare ogni oggetto in una nuova riga del nostro file CSV. Quindi, come esempio, usiamo un documento JSON contenente il seguente elenco di elementi da un ordine:

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

Useremo i nomi dei campi del documento JSON come intestazioni di colonna e lo riformatteremo nel seguente file CSV:

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

4. Leggi JSON e scrivi CSV

Innanzitutto, utilizziamo ObjectMapper di Jackson per leggere il nostro documento JSON di esempio in un albero di oggetti JsonNode :

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

Quindi, creiamo un file CsvSchema . Questo determina le intestazioni di colonna, i tipi e la sequenza di colonne nel file CSV. Per fare ciò, creiamo un CsvSchema Builder e impostiamo le intestazioni delle colonne in modo che corrispondano ai nomi dei campi JSON:

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

Quindi, creiamo un CsvMapper con il nostro CsvSchema e, infine, scriviamo jsonTree nel nostro file CSV :

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

Quando eseguiamo questo codice di esempio, il nostro documento JSON di esempio viene convertito nel file CSV previsto.

5. Leggi CSV e scrivi JSON

Ora, usiamo il CsvMapper di Jackson per leggere il nostro file CSV in un elenco di oggetti OrderLine . Per fare ciò, creiamo prima la classe OrderLine come un semplice POJO:

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

Useremo le intestazioni di colonna nel file CSV per definire il nostro CsvSchema . Quindi, utilizziamo CsvMapper per leggere i dati dal CSV in un MappingIterator di oggetti OrderLine :

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"));

Successivamente, utilizzeremo MappingIterator per ottenere un elenco di oggetti OrderLine . Quindi, usiamo ObjectMapper di Jackson per scrivere l'elenco come un documento JSON:

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

Quando eseguiamo questo codice di esempio, il nostro file CSV di esempio viene convertito nel documento JSON previsto.

6. Configurazione del formato file CSV

Usiamo alcune delle annotazioni di Jackson per regolare il formato del file CSV. Cambieremo la 'voce' intestazione di colonna per 'nome' , la 'quantità' intestazione di colonna al 'count' , rimuovere il 'UnitPrice' colonna e facciamo 'count' la prima colonna.

Quindi, il nostro file CSV previsto diventa:

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

Creeremo una nuova classe astratta per definire il formato richiesto per il file CSV:

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

Quindi, usiamo la nostra classe OrderLineForCsv per creare un CsvSchema :

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

Usiamo anche OrderLineForCsv come Jackson Mixin. Questo dice a Jackson di utilizzare le annotazioni che abbiamo aggiunto alla classe OrderLineForCsv quando elabora un oggetto OrderLine :

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

Infine, utilizziamo un ObjectMapper per leggere il nostro documento JSON in un array OrderLine e usiamo il nostro csvMapper per scrivere questo in un file CSV:

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); 

Quando eseguiamo questo codice di esempio, il nostro documento JSON di esempio viene convertito nel file CSV previsto.

7. Conclusione

In questo breve tutorial, abbiamo imparato a leggere e scrivere file CSV utilizzando la libreria del formato dati Jackson. Abbiamo anche esaminato alcune opzioni di configurazione che ci aiutano a ottenere i nostri dati come vogliamo.

Come sempre, il codice può essere trovato su GitHub.