Автор оригинала: Amy DeGregorio.
1. введение
В этом коротком уроке мы узнаем, как использовать Джексона для чтения и записи файлов YAML.
После того, как мы рассмотрим наш пример структуры, мы будем использовать ObjectMapper для чтения файла YAML в объект Java, а также для записи объекта в файл.
2. Зависимости
Давайте добавим зависимость для формата данных Jackson YAML:
com.fasterxml.jackson.dataformat jackson-dataformat-yaml 2.11.1
Мы всегда можем найти самую последнюю версию этой зависимости в Maven Central .
Наш объект Java использует Локальные данные , поэтому давайте также добавим зависимость для типа данных JSR-310:
com.fasterxml.jackson.datatype jackson-datatype-jsr310 2.11.1
Опять же, мы можем посмотреть его самую последнюю версию на Maven Central .
3. Структура данных и объектов
Теперь, когда наши зависимости улажены, мы обратимся к нашему входному файлу и классам Java, которые мы будем использовать.
Давайте сначала посмотрим на файл, в котором мы будем читать:
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Затем давайте определим класс Order :
public class Order {
private String orderNo;
private LocalDate date;
private String customerName;
private List orderLines;
// Constructors, Getters, Setters and toString
} Наконец, давайте создадим наш класс OrderLine :
public class OrderLine {
private String item;
private int quantity;
private BigDecimal unitPrice;
// Constructors, Getters, Setters and toString
}4. Чтение YAML
Мы собираемся использовать ObjectMapper Джексона для чтения нашего файла YAML в объект Order , поэтому давайте настроим его сейчас:
mapper = new ObjectMapper(new YAMLFactory());
Нам нужно использовать метод findAndRegisterModules , чтобы Джексон правильно обработал нашу Дату :
mapper.findAndRegisterModules();
Как только мы настроим наш ObjectMapper , мы просто используем readValue :
Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);Мы обнаружим, что наш объект Order заполняется из файла, включая список OrderLine .
5. Написание YAML
Мы также собираемся использовать ObjectMapper для записи Заказа в файл. Но сначала давайте добавим к нему некоторую конфигурацию:
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Добавление этой строки говорит Джексону просто записать наши данные в виде Строки вместо отдельных числовых частей.
По умолчанию наш файл будет начинаться с трех тире. Это идеально подходит для формата YAML, но мы можем отключить его, отключив функцию на YAMLFactory :
mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));
С этой дополнительной настройкой в стороне, давайте создадим Заказ :
Listlines = 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);
Давайте напишем наш заказ, используя writeValue :
mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);Когда мы смотрим в вывод order.yaml , он должен выглядеть примерно так:
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. Заключение
В этом кратком руководстве мы узнали, как читать и записывать YAML в файлы и из файлов с помощью библиотеки Джексона. Мы также рассмотрели несколько элементов конфигурации, которые помогут нам сделать наши данные такими, какими мы хотим.
Полный пример кода находится на GitHub .