java 操作 yaml 文件

YAML是一种常用的数据序列化格式,在Java应用程序中读写YAML数据是常见的任务。

本文介绍了3个受欢迎的Java工具包:SnakeYAML、Jackson Dataformat YAML和YAMLBeans,它们都提供了读写YAML数据的功能。本文将逐一介绍这些工具包的特点、Maven依赖配置,并给出使用示例。

关于yaml的介绍,参考【YAML 入门教程】( YAML 入门教程-CSDN博客

一、工具包介绍

1. SnakeYAML

SnakeYAML是一个功能强大且流行的Java库,用于读取和写入YAML数据。

提供简单而灵活的API,可以将YAML数据转换为Java对象,或将Java对象转换为YAML数据。

官方网站: https://bitbucket.org/asomov/snakeyaml

Maven 依赖

<dependency>

    <groupId>org.yaml</groupId>

    <artifactId>snakeyaml</artifactId>

    <version>1.28</version>

</dependency>

2. Jackson Dataformat YAML

Jackson Dataformat YAML是Jackson库的扩展,提供对YAML格式的支持。

允许使用相同的API来处理JSON和YAML数据。

官方网站: GitHub - FasterXML/jackson-dataformat-yaml: Jackson module to add YAML backend (parser/generator adapters)

Maven 依赖

<dependency>

    <groupId>com.fasterxml.jackson.dataformat</groupId>

    <artifactId>jackson-dataformat-yaml</artifactId>

    <version>2.12.5</version>

</dependency>

 

3. YAMLBeans

YAMLBeans是一个轻量级的Java库,用于读取和写入YAML数据。

提供简单的API,可将YAML数据映射到Java对象,并将Java对象转换为YAML数据。

官方网站: GitHub - EsotericSoftware/yamlbeans: Java object graphs, to and from YAML automatically

Maven 依赖

<dependency>

    <groupId>net.sourceforge.yamlbeans</groupId>

    <artifactId>yamlbeans</artifactId>

    <version>1.14</version>

</dependency>

二、工具包优缺点总结

1.SnakeYAML

优点:功能强大、灵活的API、广泛使用。

缺点:相对复杂,需要处理更多的细节。

2.Jackson Dataformat YAML

优点:与JSON处理库相同的API、广泛使用、与Jackson生态系统集成。

缺点:相对复杂,需要在Jackson库的基础上进行配置和使用。

3.YAMLBeans

优点:轻量级、简单易用。

缺点:相对功能较少,适用于简单的YAML数据处理。

4.总结

三种库各有千秋,根据项目需求和偏好,可以选择适合的工具包。

如果需要更多的灵活性和功能,可以选择SnakeYAML或Jackson Dataformat YAML。

如果的需求相对简单,YAMLBeans可能是一个更轻量级的选择。

无论选择哪个工具包,都可以使用上述示例代码作为起点,根据您的具体需求进行定制和扩展。

三、使用示例

1. SnakeYAML

第一步:在 pom.xml下引入依赖

<dependencies>

    <dependency>

        <groupId>org.yaml</groupId>

        <artifactId>snakeyaml</artifactId>

        <version>1.30</version>

    </dependency>

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

        <version>RELEASE</version>

        <scope>compile</scope>

    </dependency>

</dependencies>

第二步:写个工具类

import org.yaml.snakeyaml.Yaml;

 

import java.io.StringWriter;

 

public class YamlUtil {

    private YamlUtil() {

    }

 

    /**

     * Java 对象转 yaml 字符串

     *

     * @param object 对象

     * @return 字符串

     */

    public static String objectToString(Object object) {

        Yaml yaml = new Yaml();

        StringWriter sw = new StringWriter();

        yaml.dump(object, sw);

        return sw.toString();

    }

 

    /**

     * 从 yaml 字符串读取转到 Java 对象

     *

     * @param yamlStr yaml 字符串

     * @param clazz   目标类.class

     * @param <T>     目标类

     * @return 目标类对象

     */

    public static <T> T stringToObject(String yamlStr, Class<T> clazz) {

        Yaml yaml = new Yaml();

        return yaml.loadAs(yamlStr, clazz);

    }

 

}

第三步:写一个实体类

import lombok.Data;

 

import java.util.List;

import java.util.Map;

 

@Data

public class Cat {

    private String name;

    private Integer age;

    private List<String> list;

    private Map<String, String> map;

}

注意:一定要有@Data注解

第四步:代码调用

public class Demo {

    public static void main(String[] args) {

        // 预设的yaml字符串

        String yamlString = "name: 喵喵\n" +

                "age: 2\n" +

                "list: [捉老鼠, 吃鱼]\n" +

                "map: {k1: v1, k2: v2, k3: v3}\n";

 

        // yaml 字符串转成 Java 对象

        Cat cat = YamlUtil.stringToObject(yamlString, Cat.class);

        System.out.println(cat);

        System.out.println("---------------------------------");

 

        // java 对象转 yaml 字符串

        String yamlString2 = YamlUtil.objectToString(cat);

        System.out.println(yamlString2);

        System.out.println("---------------------------------");

 

        // yaml 字符串转成 Java 对象

        Cat cat2 = YamlUtil.stringToObject(yamlString2, Cat.class);

        System.out.println(cat2);

    }

}

第五步:运行结果

Cat(name=喵喵, age=2, list=[捉老鼠, 吃鱼], map={k1=v1, k2=v2, k3=v3})

---------------------------------

!!Cat

age: 2

list: [捉老鼠, 吃鱼]

map: {k1: v1, k2: v2, k3: v3}

name: 喵喵

 

---------------------------------

Cat(name=喵喵, age=2, list=[捉老鼠, 吃鱼], map={k1=v1, k2=v2, k3=v3})

2. Jackson Dataformat YAML

第一步:在 pom.xml下引入依赖

<dependencies>

    <dependency>

        <groupId>com.fasterxml.jackson.dataformat</groupId>

        <artifactId>jackson-dataformat-yaml</artifactId>

        <version>2.12.4</version>

    </dependency>

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

        <version>RELEASE</version>

        <scope>compile</scope>

    </dependency>

</dependencies>

第二步:写个工具类

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.JsonNode;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.SerializationFeature;

import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;

import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;

 

import java.io.IOException;

import java.io.StringWriter;

 

public class YamlUtil {

    /**

     * 将yaml字符串转成类对象

     *

     * @param yamlStr String

     * @param clazz   目标类

     * @param <T>     泛型

     * @return 目标类

     */

    public static <T> T stringToObject(String yamlStr, Class<T> clazz) throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

        mapper.findAndRegisterModules();

        return mapper.readValue(yamlStr, clazz);

    }

 

    /**

     * 将类对象转yaml字符串

     *

     * @param object Object

     * @return yaml String

     */

    public static String objectToString(Object object) throws IOException {

        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

        mapper.findAndRegisterModules();

        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

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

        StringWriter stringWriter = new StringWriter();

        mapper.writeValue(stringWriter, object);

        return stringWriter.toString();

    }

 

    /**

     * json 2 yaml

     *

     * @param jsonStr json String

     * @return yaml String

     * @throws JsonProcessingException Exception

     */

    public static String json2Yaml(String jsonStr) throws JsonProcessingException {

        JsonNode jsonNode = new ObjectMapper().readTree(jsonStr);

        return new YAMLMapper().writeValueAsString(jsonNode);

    }

}

第三步:写一个实体类

import lombok.Data;

 

import java.util.List;

import java.util.Map;

 

@Data

public class Cat {

    private String name;

    private Integer age;

    private List<String> list;

    private Map<String, String> map;

}

注意:一定要有@Data注解

第四步:代码调用

import java.io.IOException;

 

public class Demo {

    public static void main(String[] args) throws IOException {

        // 预设的yaml字符串

        String yamlString = "name: 喵喵\n" +

                "age: 2\n" +

                "list: [捉老鼠, 吃鱼]\n" +

                "map: {k1: v1, k2: v2, k3: v3}\n";

 

        // yaml 字符串转成 Java 对象

        Cat cat = null;

        cat = YamlUtil.stringToObject(yamlString, Cat.class);

        System.out.println(cat);

        System.out.println("---------------------------------");

 

        // java 对象转 yaml 字符串

        String yamlString2 = YamlUtil.objectToString(cat);

        System.out.println(yamlString2);

        System.out.println("---------------------------------");

 

        // yaml 字符串转成 Java 对象

        Cat cat2 = YamlUtil.stringToObject(yamlString2, Cat.class);

        System.out.println(cat2);

    }

}

第五步:运行结果

Cat(name=喵喵, age=2, list=[捉老鼠, 吃鱼], map={k1=v1, k2=v2, k3=v3})

---------------------------------

name: "喵喵"

age: 2

list:

- "捉老鼠"

- "吃鱼"

map:

  k1: "v1"

  k2: "v2"

  k3: "v3"

 

---------------------------------

Cat(name=喵喵, age=2, list=[捉老鼠, 吃鱼], map={k1=v1, k2=v2, k3=v3})

3. YAMLBeans

第一步:在 pom.xml下引入依赖

<dependencies>

    <dependency>

        <groupId>com.esotericsoftware.yamlbeans</groupId>

        <artifactId>yamlbeans</artifactId>

        <version>1.15</version>

    </dependency>

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

        <version>RELEASE</version>

        <scope>compile</scope>

    </dependency>

</dependencies>

第二步:写个工具类

import com.esotericsoftware.yamlbeans.YamlException;

import com.esotericsoftware.yamlbeans.YamlReader;

import com.esotericsoftware.yamlbeans.YamlWriter;

 

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

 

public class YamlUtil {

    private YamlUtil() {

    }

 

    /**

     * 将 Java 对象写到 yaml 文件

     *

     * @param object   对象

     * @param yamlPath 文件路径

     */

    public static void writeYaml(Object object, String yamlPath) {

        try {

            YamlWriter writer = new YamlWriter(new FileWriter(yamlPath));

            writer.write(object);

            writer.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 从 yaml 文件读取转到 Java 对象

     *

     * @param yamlPath 文件路径

     * @param clazz    目标类.class

     * @param <T>      目标类

     * @return 目标类对象

     */

    public static <T> T readYaml(String yamlPath, Class<T> clazz) {

        try {

            YamlReader reader = new YamlReader(new FileReader(yamlPath));

            try {

                return reader.read(clazz);

            } catch (YamlException e) {

                e.printStackTrace();

            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        return null;

    }

}

第三步:写一个实体类

import lombok.Data;

 

import java.util.List;

import java.util.Map;

 

@Data

public class Cat {

    private String name;

    private Integer age;

    private List<String> list;

    private Map<String, String> map;

}

第四步:代码调用

import java.io.IOException;

import java.util.Arrays;

import java.util.HashMap;

import java.util.Map;

 

public class Demo {

    public static void main(String[] args) throws IOException {

        // 1、准备 Java 对象

        Map<String, String> map = new HashMap<>();

        map.put("k1", "v1");

        map.put("k2", "v2");

        map.put("k3", "v3");

 

        Cat cat = new Cat();

        cat.setName("喵喵");

        cat.setAge(2);

        cat.setList(Arrays.asList("捉老鼠", "吃鱼"));

        cat.setMap(map);

 

        System.out.println(cat);

        YamlUtil.writeYaml(cat, "D:/1.yml");

        System.out.println("---------------------------------");

 

        Cat cat2 = YamlUtil.readYaml("D:/1.yml", Cat.class);

        System.out.println(cat2);

    }

}

第五步:运行结果

Cat(name=喵喵, age=2, list=[捉老鼠, 吃鱼], map={k1=v1, k2=v2, k3=v3})

---------------------------------

Cat(name=喵喵, age=2, list=[捉老鼠, 吃鱼], map={k1=v1, k2=v2, k3=v3})

 

D盘根目录下生成一个1.yml的文件内容如下:

!Cat

name: "\u55b5\u55b5"

age: 2

list: !java.util.Arrays$ArrayList

- "\u6349\u8001\u9f20"

- "\u5403\u9c7c"

map:

   k1: v1

   k2: v2

   k3: v3

 

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值