JacksonでYAMLを処理する方法
1. 序章
この短いチュートリアルでは、Jacksonを使用してYAMLファイルを読み書きする方法を学習します。
構造例を確認した後、 ObjectMapper を使用してYAMLファイルをJavaオブジェクトに読み込み、オブジェクトをファイルに書き込みます。
2. 依存関係
JacksonYAMLデータ形式の依存関係を追加しましょう。
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.13.0</version>
</dependency>
この依存関係の最新バージョンは、 MavenCentralでいつでも見つけることができます。
JavaオブジェクトはLocalDateを使用するため、JSR-310データ型の依存関係も追加しましょう。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.0</version>
</dependency>
ここでも、 MavenCentralで最新バージョンを検索できます。
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<OrderLine> 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を読む
JacksonのObjectMapperを使用してYAMLファイルをOrderオブジェクトに読み込むので、今すぐ設定しましょう。
mapper = new ObjectMapper(new YAMLFactory());
JacksonがDateを適切に処理できるように、findAndRegisterModulesメソッドを使用する必要があります。
mapper.findAndRegisterModules();
ObjectMapper を構成したら、 readValue:を使用するだけです。
Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);
Order オブジェクトが、OrderLineのリストを含むファイルから入力されていることがわかります。
5. YAMLを書く
また、 ObjectMapper を使用して、Orderをファイルに書き込みます。 しかし、最初に、それにいくつかの構成を追加しましょう:
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
その行を追加すると、Jacksonにに、個々の数値部分ではなく文字列として日付を書き込むように指示します。
デフォルトでは、ファイルは3つのダッシュで始まります。 これはYAML形式には完全に有効ですが、 YAMLFactoryの機能を無効にすることでオフにできます。
mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));
追加の設定が邪魔にならないようにして、Orderを作成しましょう。
List<OrderLine> 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);
writeValueを使用して注文を書いてみましょう。
mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);
orderOutput.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. 結論
このクイックチュートリアルでは、Jacksonライブラリを使用してファイルとの間でYAMLを読み書きする方法を学びました。 また、データを希望どおりに表示するのに役立ついくつかの構成項目についても検討しました。
完全なサンプルコードは、GitHubのoverです。