JSON converteren naar CSV in Java

1. Inleiding

In deze korte tutorial zullen we zien hoe je Jackson kunt gebruiken om JSON naar CSV te converteren en vice versa.

Er zijn alternatieve bibliotheken beschikbaar, zoals de CDL-klasse van org.json, maar we zullen ons hier concentreren op de Jackson-bibliotheek.

Nadat we onze voorbeeldgegevensstructuur hebben bekeken, gebruiken we een combinatie van ObjectMapper en CSVMapper om te converteren tussen JSON en CSV.

2. Afhankelijkheden

Laten we de afhankelijkheid voor Jackson CSV-gegevensformatter toevoegen:

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

We kunnen altijd de meest recente versie van deze afhankelijkheid vinden op Maven Central.

We zullen ook de afhankelijkheid toevoegen voor de kern van Jackson-databind:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Nogmaals, we kunnen de meest recente versie van deze afhankelijkheid vinden op Maven Central.

3. Gegevensstructuur

Voordat we een JSON-document opnieuw formatteren naar CSV, moeten we overwegen hoe goed ons datamodel tussen de twee formaten zal passen.

Laten we eerst eens kijken welke gegevens de verschillende formaten ondersteunen:

  • We gebruiken JSON om een ​​verscheidenheid aan objectstructuren weer te geven, inclusief degene die arrays en geneste objecten bevatten
  • We gebruiken CSV om gegevens uit een lijst met objecten weer te geven, waarbij elk object uit de lijst op een nieuwe regel verschijnt

Dit betekent dat als ons JSON-document een reeks objecten heeft, we elk object opnieuw kunnen formatteren in een nieuwe regel van ons CSV-bestand. Laten we als voorbeeld een JSON-document gebruiken met de volgende lijst met items uit een bestelling:

[{"item": "No. 9 Sprockets", "quantity": 12, "unitPrice": 1,23}, {"item": "Widget (10 mm)", "kwantiteit": 4, "unitPrice": 3,45} ]

We gebruiken de veldnamen uit het JSON-document als kolomkoppen en formatteren het opnieuw naar het volgende CSV-bestand:

artikel, aantal, eenheid Prijs "Nr. 9 tandwielen", 12,1,23 "Widget (10 mm)", 4,3.45

4. Lees JSON en schrijf CSV

Ten eerste gebruiken we Jackson's ObjectMapper om ons JSON-voorbeelddocument in een boomstructuur van JsonNode voorwerpen:

JsonNode jsonTree = nieuwe ObjectMapper (). ReadTree (nieuw bestand ("src / main / resources / orderLines.json"));

Laten we vervolgens een CsvSchema. Dit bepaalt de kolomkoppen, typen en volgorde van kolommen in het CSV-bestand. Om dit te doen, maken we een CsvSchema Builder en stel de kolomkoppen zo in dat ze overeenkomen met de JSON-veldnamen:

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

Vervolgens maken we een CsvMapper met onze CsvSchema, en tot slot schrijven we de jsonTree naar ons CSV-bestand:

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

Wanneer we deze voorbeeldcode uitvoeren, wordt ons JSON-voorbeelddocument geconverteerd naar het verwachte CSV-bestand.

5. Lees CSV en schrijf JSON

Laten we nu Jackson's gebruiken CsvMapper om ons CSV-bestand in te lezen in een Lijst van OrderLine voorwerpen. Om dit te doen, maken we eerst het OrderLine klasse als een eenvoudige POJO:

openbare klasse OrderLine {privé String-item; private int hoeveelheid; privé BigDecimal unitPrice; // Constructors, Getters, Setters en toString}

We gebruiken de kolomkoppen in het CSV-bestand om onze CsvSchema. Dan, wij gebruiken de CsvMapper om de gegevens uit de CSV te lezen in een MappingIterator van OrderLine voorwerpen:

CsvSchema orderLineSchema = CsvSchema.emptySchema (). WithHeader (); CsvMapper csvMapper = nieuwe CsvMapper (); MappingIterator orderLines = csvMapper.readerFor (OrderLine.class) .with (orderLineSchema) .readValues ​​(nieuw bestand ("src / main / resources / orderLines.csv"));

Vervolgens gebruiken we de MappingIterator om een Lijst van OrderLine voorwerpen. Dan gebruiken we Jackson's ObjectMapper om de lijst uit te schrijven als een JSON-document:

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

Wanneer we deze voorbeeldcode uitvoeren, wordt ons voorbeeld-CSV-bestand geconverteerd naar het verwachte JSON-document.

6. Configureren van het CSV-bestandsformaat

Laten we enkele annotaties van Jackson gebruiken om het formaat van het CSV-bestand aan te passen. We veranderen de 'item' kolomkop naar 'naam', de 'aantal stuks' kolomkop naar ‘Tellen ', Verwijder de 'stuksprijs' kolom, en make ‘Tellen ' de eerste kolom.

Ons verwachte CSV-bestand wordt dus:

tel, naam 12, "Nr. 9 tandwielen" 4, "Widget (10 mm)"

We maken een nieuwe abstracte klasse om het vereiste formaat voor het CSV-bestand te definiëren:

@JsonPropertyOrder ({"count", "name"}) openbare abstracte klasse OrderLineForCsv {@JsonProperty ("naam") privé String-item; @JsonProperty ("count") private int hoeveelheid; @JsonIgnore privé BigDecimal unitPrice; }

Vervolgens gebruiken we onze OrderLineForCsv class om een CsvSchema:

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

We gebruiken ook de OrderLineForCsv als een Jackson Mixin. Dit vertelt Jackson om de annotaties te gebruiken die we aan het OrderLineForCsv class wanneer het een OrderLine voorwerp:

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

Ten slotte gebruiken we een ObjectMapper om ons JSON-document in een OrderLine array en gebruik onze csvMapper om dit naar een CSV-bestand te schrijven:

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

Wanneer we deze voorbeeldcode uitvoeren, wordt ons JSON-voorbeelddocument geconverteerd naar het verwachte CSV-bestand.

7. Conclusie

In deze korte tutorial hebben we geleerd hoe we CSV-bestanden kunnen lezen en schrijven met behulp van de Jackson-gegevensindelingsbibliotheek. We hebben ook gekeken naar enkele configuratie-opties die ons helpen om onze gegevens eruit te laten zien zoals we dat willen.

Zoals altijd is de code te vinden op GitHub.