解析 YAML 文件

Posted

技术标签:

【中文标题】解析 YAML 文件【英文标题】:Parse a YAML file 【发布时间】:2014-11-05 22:40:57 【问题描述】:

这是我第一次使用 YAML 文件,所以我首先想到的是找到任何可以帮助我解析文件的库。

我找到了两个库,YamlBean 和 SnakeYAML。我不确定我要使用哪一个。

这是我尝试解析的文件示例:

users:
  user1:
    groups:
    - Premium
  user2:
    groups:
    - Mod
  user3:
    groups:
    - default
groups:
  Mod:
    permissions:
      test: true
    inheritance:
    - Premium
  default:
    permissions:
      test.test: true
    inheritance:
    - Mod
  Admin:
    permissions:
      test.test.test: true
    inheritance:
    - Mod

文件会动态变化,所以我不知道该文件将包含多少用户或组。

我想从中获取的信息是用户名和组,如下所示:

user1 Premium
user2 Mod
user3 default

从组中只有组名,如下所示:

Mod
default
Admin

谁能帮我从这里开始?什么是最好的图书馆? YamlBean 还是 SnakeYAML?

我想,我需要将信息保存在我可以轻松迭代的内容中。

【问题讨论】:

【参考方案1】:

您也可以使用Jacksons YAML module。

为了使用它,您需要几个类。将携带文件内容的模型类和负责读取 YAML 文件的类。

根模型类可能如下所示:

public class MyYamlFile 
    @JsonProperty
    private List<User> users;
    @JsonProperty
    private List<Group> groups;

    // getter methods ommitted

User(*) 类:

public class User 
    @JsonProperty
    private List<String> name;
    @JsonProperty
    private List<GroupType> groups;

    // getter methods ommitted

GroupType 可以是包含所有可能的组类型的 Enum:

public enum GroupType 
    Premium, Mod, Default

不要忘记枚举条目是区分大小写的。所以“溢价”是行不通的。 您可以通过这种方式构建所有模型类。每个子条目都应该有一个自己的模型类。

现在到您可以读取该 YAML 文件的部分:

public MyYamlFile readYaml(final File file) 
    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
    return mapper.readValue(file, MyYamlFile.class);

如您所见,这部分非常简洁,因为您不需要太多。文件实例包含您的 YAML 文件。您可以像这样创建一个:

File file = new File("path/to/my/yaml/usersAndGroups.yaml");

除了FilereadValue 方法还支持InputStreamjava.io.ReaderString(包含全部内容)、java.net.URL 和字节数组。 你应该找到适合你的东西。

(*) 您应该考虑更改 YAML 文件的结构,因为我认为 Jackson 无法使用动态密钥(也许有人对此了解更多):

users: 
    - name: user1
      groups:
        - Premium
    - name: user2
      groups:
        - Mod
    - name: user3
      groups:
        - Default
groups:
    ....

【讨论】:

感谢您让我知道 Jacksons YAML 模块。一个问题是我无法更改 yaml 文件,它是在另一个应用程序中创建的,我只是要阅读它。也许无论如何都可以使用这个模块? @KristofferIsaksson 是的,你可以试试。阅读这个问题的答案:以***.com/questions/17685508/… 为例。您将需要另一个将整个文件作为List&lt;Map&lt;String, String&gt;&gt; 的类。 user1 将是该地图中“某处”的关键。 读入地图地图怎么样:public Map&lt;String,?&gt; readYaml(final File file) final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); return mapper.readValue(file, Map.class); @MarcinGołębski 如果您想这样做,那么您可以,ObjectMapper 应该能够为您做到这一点。但这会使从您的数据中访问各个项目变得更加困难。【参考方案2】:

我最终使用了 SnakeYaml 并制作了一些拆分字符串来解决我的问题。

将 yaml 文件加载到Object,然后加载到Map,然后将结果从Map 拆分为String[],然后在for 循环中,我从String[] 中读出名称.我对组也做了同样的事情。

我知道有更好的解决方案,但这对于这个项目来说已经足够了。

感谢大家的回复。

【讨论】:

你能分享一个代码sn-p吗?我需要同样的东西。 找到这个有用的链接:stackabuse.com/…【参考方案3】:

找到了这个有用的链接,如果需要更改配置,它将在不接触 java 代码的情况下解析输入

https://stackabuse.com/reading-and-writing-yaml-files-in-java-with-snakeyaml

InputStream inputStream = new FileInputStream(new File("src/main/resources/customer.yaml"));
Yaml yaml = new Yaml();
Map<String, Object> data = yaml.load(inputStream);
System.out.println(data);

【讨论】:

【参考方案4】:

YamlBean 包含在 DMelt Java 数字计算环境中 (http://jwork.org/dmelt/)。您可以使用 jhplot.io.HFileYAML 类创建 Yaml 文件,该类创建键值映射并保存为 yaml 文件。

【讨论】:

以上是关于解析 YAML 文件的主要内容,如果未能解决你的问题,请参考以下文章

yaml文件解析

yaml文件解析

解析 YAML 文件?

在 Python 中解析 YAML 文件并访问数据?

找到 YAML 文件,但无法解析内容

解析 YAML 文件