Автор оригинала: 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 ListorderLines; // 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 .