【问题标题】:How to parse YAML file to a Java class如何将 YAML 文件解析为 Java 类
【发布时间】:2019-10-17 22:23:57
【问题描述】:

我有一个类 Recipe 代表这个 YAML 块:

id: Ex1
  uses:
    - Database: ["D1", "D2"]
    - MetaFeature: ["M1", "M2"]
    - Algorithm: ["A1", "A2"]
    - Config: ["C1", "C4"]
public class Recipe {
    private String id;
    private HashMap<String, HashSet<String>> uses;
}

有没有办法在不创建其他类或做一些技巧的情况下将此 YAML 解析为 Recipe 类?

【问题讨论】:

  • Snakeyaml 是你的朋友
  • 可能缺乏尝试/先前的研究。通常,“这里的要求,现在是什么”的问题在这里不会受到热烈欢迎。
  • @oleg.cherednik 请阅读我的另一个问题:stackoverflow.com/questions/56411334/…

标签: java parsing yaml


【解决方案1】:

首先,您必须在 maven pom.xml 中包含 SnakeYML 作为依赖项。我在下面提供了snakeyml的maven依赖项。

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.21</version>
</dependency>

如果您不使用 Maven,可以从以下链接下载 jar 文件。 http://central.maven.org/maven2/org/yaml/snakeyaml/1.21/snakeyaml-1.21.jar

我修改了您的 yml 文件位以使其正常工作。在下面找到 yml 文件的结构。

id: Ex1
uses:
  Database: ["D1", "D2"]
  MetaFeature: ["M1", "M2"]
  Algorithm: ["A1", "A2"]
  Config: ["C1", "C4"]

让我为您提供有效的代码。

import java.util.HashMap;
import java.util.HashSet;

public class Recipe {
  private String id;
  private HashMap<String, HashSet<String>> uses;

  public String getId() {
    return id;
  }

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

  public HashMap<String, HashSet<String>> getUses() {
    return uses;
  }

  public void setUses(HashMap<String, HashSet<String>> uses) {
    this.uses = uses;
  }

  @Override
  public String toString() {
    return "Recipe{" + "id='" + id + '\'' + ", uses=" + uses + '}';
  }
}

根据您的食谱类测试代码。

import org.yaml.snakeyaml.Yaml;

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

public class TestYml {
  public static void main(String[] args) throws Exception {
    Yaml yaml = new Yaml();
    InputStream inputStream =
        new FileInputStream("your location\\yml-file-name.yml");

    Recipe recipe = yaml.loadAs(inputStream,Recipe.class);
    System.out.println("recipe = " + recipe);
  }
}

【讨论】:

  • 请阅读我的另一个问题:stackoverflow.com/questions/56411334/…
  • 无论我输入文件的路径总是找不到,你把它放在哪里?即使在项目根文件夹中也找不到,尝试过 netbeans 和 vscode .. 相同的结果
  • @holms,我没有使用过 Netbean 和 VsCode,我在 Eclipse 中测试过。您可以尝试 Eclipse 或 Intellij Idea 社区版。你可以试试这样的路径InputStream inputStream = new FileInputStream("your location"+File.separator+"yml-file-name.yml");
  • apache yaml 配置是否提供类似的支持?我还没有找到这个模块能够将对象映射到一个类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 2021-08-23
  • 2019-06-09
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多