tech.chakapoko.com
Home / Java / SnakeYAML

[Java]SnakeYAMLを使ってYAMLをJavaオブジェクトに変換する

SnakeYAMLを使ってYAMLをJavaオブジェクトに変換します。

入力のYAMLは次の通りです。

id: 1
name: John Doe
createdAt: 2019-05-30 00:00:00

マッピングするJavaオブジェクトは次の通りです。

package com.example;

import java.util.Date;

public class User {

    private int id;

    private String name;

    private Date createdAt;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", createdAt=" + createdAt +
                '}';
    }

}

変換を行うコードは次の通りです。

package com.example;

import org.yaml.snakeyaml.Yaml;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Example {

    public static void main(String[] args) throws IOException {
        Path input = Paths.get("user.yml");
        try (InputStream in = Files.newInputStream(input)) {
            Yaml yaml = new Yaml();
            User user = yaml.loadAs(in, User.class);
            System.out.println(user);
        }
    }

}

結果は次のようになります。

User{id=1, name='John Doe', createdAt=Thu May 30 09:00:00 JST 2019}

上のコードでは loadAs メソッドを使いましたが、load メソッドを使うこともできます。Yaml クラスのコンストラクタに型情報を含めた Constructor オブジェクトを渡します。

package com.example;

import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Example {

    public static void main(String[] args) throws IOException {
        Path input = Paths.get("user.yml");
        try (InputStream in = Files.newInputStream(input)) {
            Constructor constructor = new Constructor(User.class);
            Yaml yaml = new Yaml(constructor);
            User user = yaml.load(in);
            System.out.println(user);
        }
    }

}

Constructor オブジェクトを渡さなかった場合は User クラスではなく Object クラスにマッピングされます。