yaml_配制的读取

博客介绍了pom.xml,重点阐述了xxx.yaml文件与Java类的对应关系,给出了具体例子代码,包含关键代码展示,如通过Yaml类加载yaml文件到MasterSlaveConfig类实例,还提及了MasterSlaveRule和MyDataSource等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pom.xml

<!--yam-->
<dependency>
  <groupId>org.yaml</groupId>
  <artifactId>snakeyaml</artifactId>
  <version>1.16</version>
</dependency>

xxx.yaml文件与java类的对应关系

具体的例子代码

 

master-slave.yaml 

dataSources:
  ds_master: !!com.qbsea.yamload.config.MyDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://xxxipxx:3306/demo_ds_master
    username: root
    password: password
  ds_slave_0: !!com.qbsea.yamload.config.MyDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://xxxipxx:3306/demo_ds_master
    username: root
    password: password
  ds_slave_1: !!com.qbsea.yamload.config.MyDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://xxxipxx:3306/demo_ds_master
    username: root
    password: password

masterSlaveRule:
  name: ds_ms
  masterDataSourceName: ds_master
  slaveDataSourceNames: [ds_slave_0, ds_slave_1]

 入口

package com.qbsea.yamload;

import com.qbsea.yamload.config.MasterSlaveConfig;
import com.qbsea.yamload.config.MasterSlaveRule;
import com.qbsea.yamload.config.MyDataSource;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Map;

public class YamLoadFileTest {

public static void main(String[] args) throws IOException {
    File yamFile = getYamlFile();
    MasterSlaveConfig masterSlaveConfig = MasterSlaveConfig.unmarshal(yamFile);
    Map<String, MyDataSource> myDataSourceMap = masterSlaveConfig.getDataSources();
    for (Map.Entry<String,MyDataSource> entry:
         myDataSourceMap.entrySet()) {
        System.out.println("key=" + entry.getKey());
        MyDataSource myDataSource = entry.getValue();
        System.out.println(myDataSource.getDriverClassName());
        System.out.println(myDataSource.getUrl());
        System.out.println(myDataSource.getUsername());
        System.out.println(myDataSource.getPassword());
        System.out.println("----------");
    }
    System.out.println("--masterSlaveRule--");
    MasterSlaveRule masterSlaveRule = masterSlaveConfig.getMasterSlaveRule();
    System.out.println("slaveRule_name=" + masterSlaveRule.getName());
    System.out.println("slaveRule_masterDatasSourceName=" + masterSlaveRule.getMasterDataSourceName());
    masterSlaveRule.getSlaveDataSourceNames().stream().forEach(iteam->{
        System.out.println("item="+iteam);
    });
}
    private static File getYamlFile() {
        return new File(YamLoadFileTest.class.getResource("/META-INF/nodep/master-slave.yaml").getFile());
    }
}

MasterSlaveConfig

关键代码

Yaml yaml = new Yaml(new Constructor(MasterSlaveConfig.class));
MasterSlaveConfig masterSlaveConfig = yaml.loadAs(inputStreamReader, MasterSlaveConfig.class);
return masterSlaveConfig;

package com.qbsea.yamload.config;

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

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class MasterSlaveConfig {
    private Map<String, MyDataSource> dataSources = new HashMap<>();
    private MasterSlaveRule masterSlaveRule;

    public static MasterSlaveConfig unmarshal(File yamlFile) throws IOException {
        try (
                FileInputStream fileInputStream = new FileInputStream(yamlFile);
                InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8")
        ) {
            Yaml yaml = new Yaml(new Constructor(MasterSlaveConfig.class));
            MasterSlaveConfig masterSlaveConfig = yaml.loadAs(inputStreamReader, MasterSlaveConfig.class);
            return masterSlaveConfig;
        }
    }

    public Map<String, MyDataSource> getDataSources() {
        return dataSources;
    }
    public void setDataSources(Map<String, MyDataSource> dataSources) {
        this.dataSources = dataSources;
    }
    public MasterSlaveRule getMasterSlaveRule() {
        return masterSlaveRule;
    }
    public void setMasterSlaveRule(MasterSlaveRule masterSlaveRule) {
        this.masterSlaveRule = masterSlaveRule;
    }
}

MasterSlaveRule 

package com.qbsea.yamload.config;

import java.util.List;

public class MasterSlaveRule {
    private String name;
    private String masterDataSourceName;
    private List<String> slaveDataSourceNames;
    //set and get method
    public String getName() {
        return name;
    }

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

    public String getMasterDataSourceName() {
        return masterDataSourceName;
    }

    public void setMasterDataSourceName(String masterDataSourceName) {
        this.masterDataSourceName = masterDataSourceName;
    }

    public List<String> getSlaveDataSourceNames() {
        return slaveDataSourceNames;
    }

    public void setSlaveDataSourceNames(List<String> slaveDataSourceNames) {
        this.slaveDataSourceNames = slaveDataSourceNames;
    }
}

MyDataSource

package com.qbsea.yamload.config;

public class MyDataSource {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    //set and get
    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

 

### 如何使用 `yaml-cpp` 库读取 YAML 文件 以下是关于如何使用 `yaml-cpp` 库来读取 YAML 文件的具体方法以及示例代码。 #### 安装 `yaml-cpp` 在开始之前,确保已经安装了 `yaml-cpp` 库。可以通过以下命令安装: ```bash sudo apt-get install libyaml-cpp-dev ``` 或者通过源码编译安装: ```bash git clone https://github.com/jbeder/yaml-cpp.git cd yaml-cpp mkdir build && cd build cmake .. make sudo make install ``` --- #### 使用 `yaml-cpp` 读取 YAML 文件的流程 1. **加载文件**:通过 `YAML::LoadFile()` 函数加载指定路径的 YAML 文件。 2. **解析节点**:获取根节点并逐层访问子节点。 3. **提取数据**:根据键名提取对应的值。 下面是一个完整的 C++ 示例程序,展示如何使用 `yaml-cpp` 来读取 YAML 文件中的内容[^4]。 --- #### 示例代码 假设有一个名为 `example.yaml` 的文件,内容如下: ```yaml name: John Doe age: 30 address: street: Main Street number: 123 city: New York hobbies: - reading - hiking - coding ``` 下面是实现读取该文件的 C++ 程序: ```cpp #include <iostream> #include <yaml-cpp/yaml.h> int main() { try { // 加载 YAML 文件 YAML::Node config = YAML::LoadFile("example.yaml"); // 提取基本字段 std::string name = config["name"].as<std::string>(); int age = config["age"].as<int>(); // 输出基本信息 std::cout << "Name: " << name << "\n"; std::cout << "Age: " << age << "\n"; // 访问嵌套结构 (地址信息) if (config["address"]) { // 检查是否存在 address 字段 std::string street = config["address"]["street"].as<std::string>(); int number = config["address"]["number"].as<int>(); std::string city = config["address"]["city"].as<std::string>(); std::cout << "Address:\n" << "Street: " << street << "\n" << "Number: " << number << "\n" << "City: " << city << "\n"; } // 遍历列表 (爱好) const YAML::Node hobbies = config["hobbies"]; if (hobbies.IsSequence()) { std::cout << "Hobbies:" << "\n"; for (unsigned i = 0; i < hobbies.size(); ++i) { std::cout << "- " << hobbies[i].as<std::string>() << "\n"; } } } catch (const YAML::Exception& e) { std::cerr << "Error while parsing YAML file: " << e.what() << "\n"; } return 0; } ``` --- #### 关键点说明 1. **异常处理**:由于可能遇到文件不存在或格式错误的情况,建议始终捕获 `YAML::Exception` 并进行适当处理[^5]。 2. **类型转换**:`yaml-cpp` 支持多种类型的自动转换(如字符串、整数、浮点数等),但如果类型不匹配会抛出异常。 3. **嵌套结构支持**:可以轻松访问多层次嵌套的数据结构。 4. **序列遍历**:对于数组或列表形式的数据,可通过 `.IsSequence()` 判断是否为序列,并逐一访问其中的元素。 --- ### 总结 以上展示了如何利用 `yaml-cpp` 库读取 YAML 文件的内容,并提供了详细的代码示例和解释。此方法适用于各种复杂度的 YAML 数据结构,能够满足大多数场景需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值