Hoe YAML te verwerken met Jackson

1. Inleiding

In deze korte tutorial gaan we leren hoe we Jackson kunnen gebruiken om YAML-bestanden te lezen en te schrijven.

Nadat we onze voorbeeldstructuur hebben doorgenomen, gebruiken we de ObjectMapper om een ​​YAML-bestand in een Java-object te lezen en ook om een ​​object naar een bestand te schrijven.

2. Afhankelijkheden

Laten we de afhankelijkheid voor het Jackson YAML-gegevensformaat toevoegen:

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

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

Ons Java-object gebruikt een LocalDate, dus laten we ook een afhankelijkheid toevoegen voor het JSR-310-datatype:

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

Nogmaals, we kunnen de meest recente versie opzoeken op Maven Central.

3. Gegevens- en objectstructuur

Nu onze afhankelijkheden in het kwadraat zijn, gaan we nu naar ons invoerbestand en de Java-klassen die we zullen gebruiken.

Laten we eerst eens kijken naar het bestand waarin we gaan lezen:

orderNo: A001 date: 2019-04-17 customerName: Customer, Joe orderLines: - artikel: nr. 9 Aantal tandwielen: 12 stuks Prijs: 1,23 - artikel: Widget (10 mm) Aantal: 4 stuks Prijs: 3,45

Laten we vervolgens het Bestellen klasse:

openbare klasse Order {private String orderNo; privé LocalDate-datum; private String klantnaam; privélijst orderLines; // Constructors, Getters, Setters en toString}

Laten we tot slot onze OrderLine klasse:

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

4. YAML lezen

We gaan die van Jackson gebruiken ObjectMapper om ons YAML-bestand in een Bestellen object, dus laten we dat nu instellen:

mapper = nieuwe ObjectMapper (nieuwe YAMLFactory ());

We moeten de findAndRegisterModules methode zodat Jackson onze Datum naar behoren:

mapper.findAndRegisterModules ();

Zodra we onze hebben ObjectMapper geconfigureerd, we gebruiken gewoon readValue:

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

We zullen ontdekken dat onze Bestellen object wordt ingevuld vanuit het bestand, inclusief de lijst met OrderLine.

5. YAML schrijven

We gaan ook gebruiken ObjectMapper om een Bestellen naar een bestand. Maar laten we er eerst wat configuratie aan toevoegen:

mapper.disable (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

Door die regel toe te voegen, vertelt Jackson dat schrijf gewoon onze date als een Draad in plaats van individuele numerieke delen.

Ons bestand begint standaard met drie streepjes. Dat is perfect geldig voor het YAML-formaat, maar we kunnen het uitschakelen door de functie uit te schakelen op de YAMLFactory:

mapper = nieuwe ObjectMapper (nieuwe YAMLFactory (). uitschakelen (Feature.WRITE_DOC_START_MARKER));

Laten we, met die extra set-up uit de weg, een Bestellen:

Lijstregels = nieuwe ArrayList (); lines.add (nieuwe OrderLine ("Copper Wire (200ft)", 1, nieuwe 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", regels);

Laten we onze bestelling schrijven met writeValue:

mapper.writeValue (nieuw bestand ("src / main / resources / orderOutput.yaml"), order);

Als we kijken naar de orderOutput.yaml, zou het er ongeveer zo uit moeten zien:

orderNo: "B-9910" datum: "2019-04-18" customerName: "Customer, Jane" orderLines: - item: "Copper Wire (200ft)" hoeveelheid: 1 eenheid Prijs: 50,67 - item: "Wasmachines (1/4 \ ")" hoeveelheid: 24 stuks Prijs: 0,15

6. Conclusie

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

De volledige voorbeeldcode is voorbij op GitHub.