Cara Memproses YAML dengan Jackson

1. Pengenalan

Dalam tutorial ringkas ini, kita akan belajar bagaimana menggunakan Jackson untuk membaca dan menulis fail YAML.

Setelah kita melihat struktur contoh kita, kita akan menggunakan ObjectMapper untuk membaca fail YAML ke dalam objek Java dan juga menuliskan objek ke file.

2. Kebergantungan

Mari tambahkan kebergantungan untuk format data Jackson YAML:

 com.fasterxml.jackson.dataformat jackson-dataformat-yaml 2.11.1 

Kita selalu dapat mencari versi terbaru dari pergantungan ini pada Maven Central.

Objek Java kami menggunakan LocalDate , jadi mari kita tambahkan kebergantungan untuk jenis data JSR-310:

 com.fasterxml.jackson.datatype jackson-datatype-jsr310 2.11.1 

Sekali lagi, kita dapat melihat versi terbarunya di Maven Central.

3. Struktur Data dan Objek

Dengan kebergantungan kita dihapus, kita sekarang akan beralih ke fail input dan kelas Java yang akan kita gunakan.

Mari lihat dahulu fail yang akan kita baca:

orderNo: A001 date: 2019-04-17 customerName: Customer, Joe orderLines: - item: No. 9 Sprockets quantity: 12 unitPrice: 1.23 - item: Widget (10mm) quantity: 4 unitPrice: 3.45

Kemudian, mari tentukan kelas Pesanan :

public class Order { private String orderNo; private LocalDate date; private String customerName; private List orderLines; // Constructors, Getters, Setters and toString }

Akhirnya, mari buat kelas OrderLine kami :

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

4. Membaca YAML

Kita akan menggunakan Jackson's ObjectMapper untuk membaca fail YAML kita menjadi objek Pesanan , jadi mari kita siapkan sekarang:

mapper = new ObjectMapper(new YAMLFactory());

Kita perlu menggunakan kaedah findAndRegisterModules supaya Jackson mengendalikan Tarikh kita dengan betul:

mapper.findAndRegisterModules();

Setelah kami mengkonfigurasi ObjectMapper , kami hanya menggunakan readValue :

Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);

Kami akan mendapati bahawa objek Pesanan kami diisi dari fail, termasuk senarai OrderLine .

5. Menulis YAML

Kami juga akan menggunakan ObjectMapper untuk menulis pesanan ke fail. Tetapi pertama, mari tambahkan beberapa konfigurasi padanya:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

Menambah garis itu memberitahu Jackson hanya menulis tarikh kita sebagai Rentetan dan bukannya bahagian angka individu.

Secara lalai, fail kami akan dimulakan dengan tiga tanda sempang. Itu betul-betul sah untuk format YAML, tetapi kami boleh mematikannya dengan mematikan ciri di YAMLFactory :

mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));

Dengan penyediaan tambahan itu, mari buat Pesanan :

List lines = new ArrayList(); lines.add(new OrderLine("Copper Wire (200ft)", 1, new BigDecimal(50.67).setScale(2, RoundingMode.HALF_UP))); lines.add(new OrderLine("Washers (1/4\")", 24, new BigDecimal(.15).setScale(2, RoundingMode.HALF_UP))); Order order = new Order( "B-9910", LocalDate.parse("2019-04-18", DateTimeFormatter.ISO_DATE), "Customer, Jane", lines);

Mari tulis pesanan kami menggunakan writeValue :

mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);

Apabila kita melihat orderOutput.yaml , ia akan kelihatan serupa dengan:

orderNo: "B-9910" date: "2019-04-18" customerName: "Customer, Jane" orderLines: - item: "Copper Wire (200ft)" quantity: 1 unitPrice: 50.67 - item: "Washers (1/4\")" quantity: 24 unitPrice: 0.15

6. Kesimpulannya

Dalam tutorial ringkas ini, kami belajar membaca dan menulis YAML ke dan dari fail menggunakan perpustakaan Jackson. Kami juga melihat beberapa item konfigurasi yang akan membantu kami mendapatkan data kami seperti yang kami mahukan.

Kod contoh lengkap ada di GitHub.