Cum se procesează YAML cu Jackson

1. Introducere

În acest scurt tutorial, vom învăța cum să-l folosim pe Jackson pentru a citi și scrie fișiere YAML.

După ce vom trece peste structura noastră de exemplu, vom folosi ObjectMapper pentru a citi un fișier YAML într-un obiect Java și, de asemenea, să scriem un obiect într-un fișier.

2. Dependențe

Să adăugăm dependența pentru formatul de date Jackson YAML:

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

Putem găsi întotdeauna cea mai recentă versiune a acestei dependențe de Maven Central.

Obiectul nostru Java folosește un LocalDate , deci să adăugăm și o dependență pentru tipul de date JSR-310:

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

Din nou, putem căuta cea mai recentă versiune a sa pe Maven Central.

3. Structura datelor și a obiectelor

Cu dependențele noastre pătrate, vom trece acum la fișierul nostru de intrare și la clasele Java pe care le vom folosi.

Să vedem mai întâi fișierul în care vom citi:

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

Apoi, să definim clasa de comandă :

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

În cele din urmă, să creăm clasa noastră OrderLine :

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

4. Citirea YAML

Vom folosi ObjectMapper-ul lui Jackson pentru a citi fișierul nostru YAML într-un obiect de comandă , așa că hai să îl configurăm acum:

mapper = new ObjectMapper(new YAMLFactory());

Trebuie să folosim metoda findAndRegisterModules , astfel încât Jackson să se ocupe corect de data noastră :

mapper.findAndRegisterModules();

Odată ce avem ObjectMapper configurat, folosim pur și simplu readValue :

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

Vom descoperi că obiectul nostru de comandă este completat din fișier, inclusiv lista OrderLine .

5. Scrierea YAML

De asemenea, vom folosi ObjectMapper pentru a scrie o comandă într-un fișier. Dar, mai întâi, să adăugăm o configurație:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

Adăugarea acelei linii îi spune lui Jackson să scrie doar data noastră ca un șir în loc de părți numerice individuale.

În mod implicit, fișierul nostru va începe cu trei liniuțe. Acest lucru este perfect valabil pentru formatul YAML, dar îl putem dezactiva dezactivând caracteristica de pe YAMLFactory :

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

Cu acea setare suplimentară în afara drumului, să creăm o comandă :

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

Să scriem comanda noastră folosind writeValue :

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

Când ne uităm la orderOutput.yaml , ar trebui să arate similar cu:

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. Concluzie

În acest tutorial rapid, am învățat cum să citim și să scriem YAML în și din fișiere folosind biblioteca Jackson. De asemenea, am analizat câteva elemente de configurare care ne vor ajuta să obținem datele noastre așa cum dorim.

Exemplul complet de cod este terminat pe GitHub.