Mengonversi JSON ke CSV di Java

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat bagaimana menggunakan Jackson untuk mengubah JSON menjadi CSV dan sebaliknya.

Ada pustaka alternatif yang tersedia, seperti kelas CDL dari org.json, tetapi kami hanya akan fokus pada pustaka Jackson di sini.

Setelah kita melihat contoh struktur data kita, kita akan menggunakan kombinasi ObjectMapper dan CSVMapper untuk mengkonversi antara JSON dan CSV.

2. Dependensi

Mari tambahkan ketergantungan untuk pemformat data CSV Jackson:

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

Kami selalu dapat menemukan versi terbaru dari ketergantungan ini di Maven Central.

Kami juga akan menambahkan ketergantungan untuk inti data Jackson:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Sekali lagi, kita dapat menemukan versi terbaru dari ketergantungan ini di Maven Central.

3. Struktur Data

Sebelum kita memformat ulang dokumen JSON ke CSV, kita perlu mempertimbangkan seberapa baik model data kita akan memetakan antara kedua format.

Jadi pertama-tama, mari pertimbangkan data apa yang didukung oleh berbagai format:

  • Kami menggunakan JSON untuk mewakili berbagai struktur objek, termasuk yang berisi array dan objek bersarang
  • Kami menggunakan CSV untuk mewakili data dari daftar objek, dengan setiap objek dari daftar muncul di baris baru

Ini berarti bahwa jika dokumen JSON kita memiliki larik objek, kita dapat memformat ulang setiap objek menjadi baris baru dari file CSV kita. Jadi, sebagai contoh, mari gunakan dokumen JSON yang berisi daftar item berikut dari pesanan:

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

Kami akan menggunakan nama bidang dari dokumen JSON sebagai tajuk kolom, dan memformatnya ke file CSV berikut:

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

4. Baca JSON dan Tulis CSV

Pertama, kami menggunakan ObjectMapper Jackson untuk membaca contoh dokumen JSON kami ke dalam pohon objek JsonNode :

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

Selanjutnya, mari buat CsvSchema . Ini menentukan tajuk kolom, jenis, dan urutan kolom di file CSV. Untuk melakukan ini, kami membuat CsvSchema Builder dan menyetel header kolom agar sesuai dengan nama kolom JSON:

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

Kemudian, kita membuat CsvMapper dengan kami CsvSchema , dan akhirnya, kita menulis jsonTree ke file CSV kami :

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

Saat kami menjalankan kode contoh ini, contoh dokumen JSON kami diubah menjadi file CSV yang diharapkan.

5. Membaca CSV dan Menulis JSON

Sekarang, mari gunakan CsvMapper Jackson untuk membaca file CSV kita menjadi objek List of OrderLine . Untuk melakukan ini, pertama-tama kita membuat kelas OrderLine sebagai POJO sederhana:

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

Kami akan menggunakan tajuk kolom di file CSV untuk menentukan CsvSchema kami . Kemudian, kami menggunakan CsvMapper untuk membaca data dari CSV yang menjadi MappingIterator dari Orderline objek:

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

Selanjutnya, kita akan menggunakan MappingIterator untuk mendapatkan objek List of OrderLine . Kemudian, kami menggunakan ObjectMapper Jackson untuk menulis daftar sebagai dokumen JSON:

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

Saat kami menjalankan kode contoh ini, contoh file CSV kami diubah menjadi dokumen JSON yang diharapkan.

6. Mengkonfigurasi Format File CSV

Mari gunakan beberapa anotasi Jackson untuk menyesuaikan format file CSV. Kami akan mengubah judul kolom 'item' menjadi 'name' , kolom 'quantity' menjadi 'count' , menghapus kolom 'unitPrice' , dan menjadikan 'count' sebagai kolom pertama.

Jadi, file CSV yang kami harapkan menjadi:

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

Kami akan membuat kelas abstrak baru untuk menentukan format yang diperlukan untuk file CSV:

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

Kemudian, kami menggunakan kelas OrderLineForCsv kami untuk membuat CsvSchema :

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

Kami juga menggunakan OrderLineForCsv sebagai Jackson Mixin. Ini memberi tahu Jackson untuk menggunakan anotasi yang kami tambahkan ke kelas OrderLineForCsv saat memproses objek OrderLine :

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

Terakhir, kami menggunakan ObjectMapper untuk membaca dokumen JSON kami ke dalam array OrderLine , dan menggunakan csvMapper kami untuk menulis ini ke 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); 

Saat kami menjalankan kode contoh ini, contoh dokumen JSON kami diubah menjadi file CSV yang diharapkan.

7. Kesimpulan

Dalam tutorial singkat ini, kami mempelajari cara membaca dan menulis file CSV menggunakan pustaka format data Jackson. Kami juga melihat beberapa opsi konfigurasi yang membantu kami mendapatkan data seperti yang kami inginkan.

Seperti biasa, kode dapat ditemukan di GitHub.