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.