Java >> Java tutorial >  >> Tag >> Json

Konvertering af JSON til CSV i Java

1. Introduktion

I denne korte vejledning vil vi se, hvordan du bruger Jackson til at konvertere JSON til CSV og omvendt.

Der er alternative biblioteker tilgængelige, såsom CDL-klassen fra org.json, men vi vil kun fokusere på Jackson-biblioteket her.

Når vi har set på vores eksempeldatastruktur, bruger vi en kombination af ObjectMapper og CSVMapper for at konvertere mellem JSON og CSV.

2. Afhængigheder

Lad os tilføje afhængigheden for Jackson CSV-dataformater:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
    <version>2.13.0</version>
</dependency>

Vi kan altid finde den seneste version af denne afhængighed på Maven Central.

Vi tilføjer også afhængigheden for Jacksons kernedatabinding:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

Igen kan vi finde den seneste version af denne afhængighed på Maven Central.

3. Datastruktur

Før vi omformaterer et JSON-dokument til CSV, skal vi overveje, hvor godt vores datamodel vil kortlægges mellem de to formater.

Så lad os først overveje, hvilke data de forskellige formater understøtter:

  • Vi bruger JSON til at repræsentere en række objektstrukturer, inklusive dem, der indeholder arrays og indlejrede objekter
  • Vi bruger CSV til at repræsentere data fra en liste over objekter, hvor hvert objekt fra listen vises på en ny linje

Dette betyder, at hvis vores JSON-dokument har en række objekter, kan vi omformatere hvert objekt til en ny linje i vores CSV-fil. Så lad os som et eksempel bruge et JSON-dokument, der indeholder følgende liste over varer fra en ordre:

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

Vi bruger feltnavnene fra JSON-dokumentet som kolonneoverskrifter og omformaterer det til følgende CSV-fil:

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

4. Læs JSON og skriv CSV

Først bruger vi Jacksons ObjectMapper at læse vores eksempel JSON-dokument ind i et træ af JsonNode objekter:

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

Lad os derefter oprette et CsvSchema . Dette bestemmer kolonneoverskrifter, typer og rækkefølge af kolonner i CSV-filen. For at gøre dette opretter vi en CsvSchema Builder og sæt kolonneoverskrifterne til at matche JSON-feltnavnene:

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

Derefter opretter vi en CsvMapper med vores CsvSchema , og til sidst skriver vi jsonTree til vores CSV-fil :

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

Når vi kører denne eksempelkode, konverteres vores eksempel JSON-dokument til den forventede CSV-fil.

5. Læs CSV og skriv JSON

Lad os nu bruge Jacksons CsvMapper for at læse vores CSV-fil til en liste af OrderLine genstande. For at gøre dette opretter vi først OrderLine klasse som en simpel POJO:

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

Vi bruger kolonneoverskrifterne i CSV-filen til at definere vores CsvSchema . vi bruger CsvMapper for at læse dataene fra CSV'en ind i en MappingIterator af OrderLine objekter:

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

Dernæst bruger vi MappingIterator for at få en liste af OrderLine genstande. Derefter bruger vi Jacksons ObjectMapper for at skrive listen ud som et JSON-dokument:

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

Når vi kører denne eksempelkode, konverteres vores eksempel-CSV-fil til det forventede JSON-dokument.

6. Konfiguration af CSV-filformatet

Lad os bruge nogle af Jacksons anmærkninger til at justere formatet på CSV-filen. Vi ændrer 'vare' kolonneoverskrift til 'navn' , 'mængde' kolonneoverskrift til 'count' , fjern 'unitPrice' kolonne, og lav 'count' den første kolonne.

Så vores forventede CSV-fil bliver:

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

Vi opretter en ny abstrakt klasse for at definere det nødvendige format for CSV-filen:

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

}

Derefter bruger vi vores OrderLineForCsv klasse for at oprette et CsvSchema :

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

Vi bruger også OrderLineForCsv som en Jackson Mixin. Dette fortæller Jackson om at bruge de anmærkninger, vi har tilføjet til OrderLineForCsv klasse, når den behandler en OrderLine objekt:

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

Til sidst bruger vi en ObjectMapper at læse vores JSON-dokument ind i en OrderLine array, og brug vores csvMapper for at skrive dette til en CSV-fil:

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

Når vi kører denne eksempelkode, konverteres vores eksempel JSON-dokument til den forventede CSV-fil.

7. Konklusion

I denne hurtige vejledning lærte vi, hvordan man læser og skriver CSV-filer ved hjælp af Jacksons dataformatbibliotek. Vi har også set på nogle få konfigurationsmuligheder, der hjælper os med at få vores data til at se ud, som vi ønsker.

Som altid kan koden findes på GitHub.


Java tag