Como processar YAML com Jackson

Como processar YAML com Jackson

1. Introdução

Neste breve tutorial, vamos aprender como usarJackson para ler e escrever arquivos YAML.

Depois de revisar nossa estrutura de exemplo, usaremosObjectMapper para ler um arquivo YAML em um objeto Java e também gravar um objeto em um arquivo.

2. Dependências

Vamos adicionar a dependência para o formato de dados Jackson YAML:


    com.fasterxml.jackson.dataformat
    jackson-dataformat-yaml
    2.9.8

Sempre podemos encontrar a versão mais recente dessa dependência emMaven Central.

Nosso objeto Java usa umLocalDate, então vamos também adicionar uma dependência para o tipo de dados JSR-310:


    com.fasterxml.jackson.datatype
    jackson-datatype-jsr310
    2.9.8

Novamente, podemos consultar sua versão mais recente emMaven Central.

3. Estrutura de Dados e Objetos

Com nossas dependências eliminadas, vamos agora nos voltar para nosso arquivo de entrada e as classes Java que usaremos.

Vejamos primeiro o arquivo que leremos:

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

Então, vamos definir a classeOrder:

public class Order {
    private String orderNo;
    private LocalDate date;
    private String customerName;
    private List orderLines;

    // Constructors, Getters, Setters and toString
}

Finalmente, vamos criar nossa classeOrderLine:

public class OrderLine {
    private String item;
    private int quantity;
    private BigDecimal unitPrice;

    // Constructors, Getters, Setters and toString
}

4. Reading YAML

We’re going to use Jackson’s ObjectMapper para ler nosso arquivo YAML em um objetoOrder, então vamos configurar isso agora:

mapper = new ObjectMapper(new YAMLFactory());

Precisamos usar o métodofindAndRegisterModules para que Jackson manipule nossosDate corretamente:

mapper.findAndRegisterModules();

Assim que tivermos nossoObjectMapper configurado,we simply use readValue:

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

Descobriremos que nosso objetoOrder é preenchido a partir do arquivo, incluindo a lista deOrderLine.

5. Escrevendo YAML

Também vamos usarObjectMapper para gravar umOrder em um arquivo. Mas, primeiro, vamos adicionar algumas configurações a ele:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

Adicionar essa linha diz a Jackson parajust write our date as a String em vez de partes numéricas individuais.

Por padrão, nosso arquivo começará com três traços. Isso é perfeitamente válido para o formato YAML, maswe can turn it off by disabling the feature noYAMLFactory:

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

Com essa configuração adicional fora do caminho, vamos criar umOrder:

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

Vamos escrever nosso pedido usandowriteValue:

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

Quando olhamos paraorderOutput.yaml, deve ser semelhante a:

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. Conclusão

Neste tutorial rápido, aprendemos a ler e gravar YAML para e de arquivos usando a biblioteca Jackson. Também analisamos alguns itens de configuração que nos ajudarão a obter nossos dados da maneira que queremos.

O código de exemplo completo éover on GitHub.