解析yaml文件

Kri*_*son 49 java yaml

这是我第一次使用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
Run Code Online (Sandbox Code Playgroud)

该文件将更改为动态,因此我不知道该文件将包含多少用户或组.

我想从中获取的信息是用户名和这样的组

user1 Premium
user2 Mod
user3 default
Run Code Online (Sandbox Code Playgroud)

并且从组中只有组名,就像这样

Mod
default
Admin
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我从这里开始?什么是最好用的库?YamlBean或SnakeYaml.

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

Tom*_*Tom 51

您也可以使用Jacksons YAML模块.

为了使用它,你需要几个类.包含文件内容的模型类和负责读取YAML文件的类.

根模型类可能如下所示:

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

    // getter methods ommitted
}
Run Code Online (Sandbox Code Playgroud)

用户(*)类:

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

    // getter methods ommitted
}
Run Code Online (Sandbox Code Playgroud)

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

public enum GroupType {
    Premium, Mod, Default
}
Run Code Online (Sandbox Code Playgroud)

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

现在到可以阅读YAML文件的部分:

public MyYamlFile readYaml(final File file) {
    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
    return mapper.readValue(file, MyYamlFile.class);
}
Run Code Online (Sandbox Code Playgroud)

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

File file = new File("path/to/my/yaml/usersAndGroups.yaml");
Run Code Online (Sandbox Code Playgroud)

代替FilereadValue方法也支持InputStream,java.io.Reader,String(与整个内容),java.net.URL和字节数组.你应该找到适合你的东西.

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

users: 
    - name: user1
      groups:
        - Premium
    - name: user2
      groups:
        - Mod
    - name: user3
      groups:
        - Default
groups:
    ....
Run Code Online (Sandbox Code Playgroud)

  • 感谢您告诉我Jacksons YAML模块.一个问题是我没有可能更改yaml文件,它在另一个应用程序中创建,我只是想读它.或许可以使用这个模块吗? (4认同)

Kri*_*son 14

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

将yaml文件加载Object到a然后转换为a Map,然后将结果从Mapinto拆分String[],然后在for循环中我从中读出名称String[].我和小组一样.

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

谢谢大家的回复.