Yaml 工具类

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

/**
 * YAML解析
 *
 * @author errorfatal89@gmail.com
 * @date 2022/03/11
 */
@Slf4j
public class YamlUtil {

    /**
     * 将yaml配置转换为对象
     * @param clazz 类定义
     * @param path 文件路径
     * @param <T>
     * @return java对象
     */
    public static <T> T readObject(Class<T> clazz, String path) {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        mapper.findAndRegisterModules();
        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        try {
            return mapper.readValue(new File(path), clazz);
        } catch (JsonProcessingException e) {
            log.error("json process error, value: {}", path, e);
        } catch (IOException e) {
            log.error("json process error, value: {}", path, e);
        }

        return null;
    }

    /**
     * 将yaml配置转换为对象
     * @param clazz 类定义
     * @param in 文件流
     * @param <T>
     * @return java对象
     */
    public static <T> T readObject(Class<T> clazz, InputStream in) {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        mapper.findAndRegisterModules();
        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        try {
            return mapper.readValue(in, clazz);
        } catch (JsonProcessingException e) {
            log.error("json process error", e);
        } catch (IOException e) {
            log.error("json process error",  e);
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                log.error("json process error",  e);
            }
        }

        return null;
    }

    /**
     * 将yaml配置转换为对象
     * @param type 类定义
     * @param in 文件流
     * @param <T>
     * @return java对象
     */
    public static <T> T readObject(TypeReference<T> type, InputStream in) {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        mapper.findAndRegisterModules();
        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        try {
            return mapper.readValue(in, type);
        } catch (JsonProcessingException e) {
            log.error("json process error", e);
        } catch (IOException e) {
            log.error("json process error",  e);
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                log.error("json process error",  e);
            }
        }

        return null;
    }


    /**
     * 将yaml配置转换为对象
     * @param clazz 类定义
     * @param text 内容
     * @param <T>
     * @return java对象
     */
    public static <T> T readObject(String text, Class<T> clazz) {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        mapper.findAndRegisterModules();
        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        try {
            return mapper.readValue(new File(text), clazz);
        } catch (JsonProcessingException e) {
            log.error("json process error, value: {}", text, e);
        } catch (IOException e) {
            log.error("json process error, value: {}", text, e);
        }

        return null;
    }

    /**
     * 将yaml配置转换为对象
     * @param type 类定义
     * @param in 文件流
     * @param <T>
     * @return java对象
     */
    public static <T> T readObject(InputStream in, Class<T> clazz, String prefix) {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        mapper.findAndRegisterModules();
        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        try {
            Map<String, Object> map = mapper.readValue(in, new TypeReference<Map<String, Object>>(){});
            return convertObject(clazz, prefix, map);
        } catch (JsonProcessingException e) {
            log.error("json process error", e);
        } catch (IOException e) {
            log.error("json process error",  e);
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                log.error("json process error",  e);
            }
        }

        return null;
    }

    private static <T> T convertObject(Class<T> clazz, String prefix, Map<String, Object> map) {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.convertValue(map.get(prefix), clazz);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java YAML工具类是一种用于处理YAML格式文件的工具类,可以方便地读取、写入和操作YAML文件。 Java中有许多开源的第三方库可以用来处理YAML文件,比如SnakeYAML、Jackson、YAMLBeans等。这些库提供了完整的API和功能,可以帮助开发人员处理YAML文件的各种操作。 使用Java YAML工具类,我们可以通过简单的代码实现读取YAML文件的功能。通过调用相应的方法,我们可以将YAML文件的内容读取到一个Java对象中,然后进行相应的操作和处理。同时,我们也可以将Java对象以YAML格式写入到文件中,或者将Java对象转换为YAML字符串进行传输或存储。 Java YAML工具类还提供了更高级的功能,比如支持对象的序列化和反序列化、自定义类型映射、错误处理等。我们可以通过配置相应的参数和监听器来实现这些功能。 总之,Java YAML工具类可以方便地处理YAML格式文件,在Java应用中起到了重要的作用。无论是读取配置文件、解析数据文件还是进行数据交换,Java YAML工具类都是一个很好的选择。 ### 回答2: Java开发中,YAMLYAML Ain't Markup Language)是一种轻量级的数据序列化格式,与JSON和XML类似,但更加直观和易读。为了在Java中处理YAML格式的数据,可以使用Java YAML工具类Java YAML工具类是一个用于读取和写入YAML文件的工具类。它提供了简单易用的API,使得在Java程序中处理YAML数据变得非常方便。 对于读取YAML文件,Java YAML工具类通常提供了以下几个步骤: 1. 创建一个YAML Parser对象,用于解析YAML文件。 2. 使用YAML Parser对象的API读取YAML文件的内容。通过提供文件路径或输入流,可以将YAML文件解析成Java对象。 3. 将解析后的Java对象用于后续的数据处理。 对于写入YAML文件,Java YAML工具类可以使用以下步骤: 1. 创建一个YAML Writer对象,用于将数据写入YAML文件。 2. 使用YAML Writer对象的API将Java对象转换为YAML格式的字符串。 3. 将YAML格式的字符串写入目标文件。 Java YAML工具类通常提供了丰富的API,可以处理各种类型的数据,包括基本数据类型、对象、集合等。它还支持注释、多文档以及一些高级特性,如引用和锚点。 Java YAML工具类的使用可以大大简化YAML数据的处理过程,提高开发效率。同时,它还能够保持YAML数据的格式和结构,使得程序的逻辑更加清晰易读。 综上所述,Java YAML工具类是一种用于读取和写入YAML文件的工具类,通过简单易用的API,可以在Java程序中方便地处理YAML格式的数据。它能够保持YAML数据的格式和结构,提高开发效率和代码可读性。 ### 回答3: Java中的YAML工具类是一种用于读取和写入YAML文件的工具。YAMLYAML Ain't Markup Language)是一种人类可读的数据序列化格式,与JSON类似,但更易于阅读和编辑。 使用JavaYAML工具类,我们可以轻松地读取YAML文件并将其转换为Java对象,或者将Java对象转换为YAML格式。 在使用YAML工具类之前,我们需要引入相应的依赖库。常见的Java YAML库有SnakeYAML和Jackson YAML等。 例如,使用SnakeYAML库,可以使用以下代码读取YAML文件并转换为Java对象: ```java import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; public class Main { public static void main(String[] args) throws Exception { // 读取YAML文件 Yaml yaml = new Yaml(); FileInputStream inputStream = new FileInputStream("data.yaml"); Object data = yaml.load(inputStream); // 将YAML数据转换为Java对象 MyClass myObject = (MyClass) data; // 使用Java对象 System.out.println(myObject.getName()); } } class MyClass { private String name; // getter和setter方法 } ``` 上述代码首先创建了一个Yaml对象,然后通过FileInputStream读取了名为"data.yaml"的YAML文件。load方法将YAML数据加载到一个Java对象中,然后我们可以使用这个Java对象。 此外,我们还可以将Java对象转换为YAML格式并写入YAML文件。例如,使用上述的MyClass对象,可以使用以下代码将其转换为YAML格式并写入文件: ```java import org.yaml.snakeyaml.Yaml; import java.io.FileWriter; public class Main { public static void main(String[] args) throws Exception { // 创建Java对象 MyClass myObject = new MyClass(); myObject.setName("John"); // 将Java对象转换为YAML Yaml yaml = new Yaml(); String output = yaml.dump(myObject); // 将YAML写入文件 FileWriter writer = new FileWriter("output.yaml"); writer.write(output); writer.close(); } } class MyClass { private String name; // getter和setter方法 } ``` 上述代码将创建一个名为"John"的MyClass对象,并将其转换为YAML格式。然后,通过FileWriterYAML数据写入名为"output.yaml"的文件中。 总之,JavaYAML工具类使我们能够轻松地读取和写入YAML文件,以及将YAML数据转换为Java对象和反之。这为处理YAML格式的数据提供了便利和灵活性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值