Connections

Работа с yaml

Дока1
Дока2

:!: Пример

Зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.13.0</version>
</dependency>
// это для работы с датой
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.13.0</version>
</dependency>

Создаем класс для данных:

public class Order {
    private String orderNo;
    private LocalDate date;
    private String customerName;
    private List<OrderLine> orderLines;
    // Constructors, Getters, Setters and toString
}
 
 
// Можно еще вложенный добавить:
public class OrderLine {
    private String item;
    private int quantity;
    private BigDecimal unitPrice;
    // Constructors, Getters, Setters and toString
}

Чтение из файла:

mapper = new ObjectMapper(new YAMLFactory());
// для обработки даты
mapper.findAndRegisterModules();
Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);

Запись в файл:

// это для работы с датой
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));
// -== Создаем объект класса order, заполняем данными ==-
// записываем в файл
mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);

пример yml:

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
:!: Тест

Простой пример, три поля, число и две строки
Пустой или отсутствующий файл - исключение либо NPE тоже может быть
Если ключ есть но без значения, инициализируется null
Если ключа нет, то похоже сработал конструктор
Похоже должен хотя бы один ключ присутствовать в файле, тогда проходит загрузка
Ну да, при отсутствии значений в файле, null либо конструктор кароче, числа нулем

:!: Аннотации

При объявлении класса, можно использовать аннотации, для добавления функционала, например:

  • @JsonIgnore — ставится над элементом, который нужно игнорировать при сериализации/десериализации
  • @JsonFormat — позволяет задать формат сериализованных данных (удобно с датой например)
  • @JsonProperty — позволяет изменить имя свойства, в которое будет сериализировано поле
  • @JsonInclude — с помощью этой аннотации можно указать, в каком случае поле должно сериализироваться
  • @JsonPropertyOrder — позволяет задать порядок сериализации полей