解析yaml文件

时间:2014-09-11 20:46:37

标签: java yaml

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

我找到了两个库YamlBeanSnakeYaml我不确定我将使用哪一个。

以下是我尝试解析的文件的示例

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。

我想,我需要将信息保存在我很容易迭代的内容中。

4 个答案:

答案 0 :(得分:48)

您也可以使用Jacksons YAML module

为了使用它,你需要一些课程。包含文件内容的模型类和负责读取YAML文件的类。

根模型类可能如下所示:

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

    // getter methods ommitted
}

用户(*)类:

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

    // getter methods ommitted
}

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

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");

而不是File readValue方法也支持InputStreamjava.io.ReaderString(包含全部内容),java.net.URL和字节阵列。 你应该找到适合你的东西。

(*)您应该考虑更改YAML文件的结构,因为我不认为可以使用Jackson的动态密钥(可能有人知道更多):

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

答案 1 :(得分:14)

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

将yaml文件加载到Object然后加载到Map,然后将结果从Map拆分为String[],然后再转换为for循环我从String[]读出了这个名字。我对小组做了同样的事。

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

感谢大家的回复。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

找到了这个有用的链接,如果需要更改配置,它可以在不接触 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);