Java 解析YAML文件

Java 解析YAML文件,java,yaml,Java,Yaml,这是我第一次使用YAML文件,所以我首先想到的是找到任何可以帮助我解析文件的库 我找到了两个库,YamlBean和SnakeYAML。我不确定我要用哪一个 下面是我试图解析的文件的一个示例: users: user1: groups: - Premium user2: groups: - Mod user3: groups: - default groups: Mod: permissions: test: tr

这是我第一次使用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
public class MyYamlFile {
    @JsonProperty
    private List<User> users;
    @JsonProperty
    private List<Group> groups;

    // getter methods ommitted
}
File file = new File("path/to/my/yaml/usersAndGroups.yaml");
组中只有组名,如下所示:

user1 Premium
user2 Mod
user3 default
Mod
default
Admin
public class MyYamlFile {
    @JsonProperty
    private List<User> users;
    @JsonProperty
    private List<Group> groups;

    // getter methods ommitted
}
File file = new File("path/to/my/yaml/usersAndGroups.yaml");
谁能帮我从这里开始?这方面最好的图书馆是什么? YamlBean还是SnakeYAML

我想,我需要将信息保存在一个我可以轻松迭代的地方

您也可以使用

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

根模型类可以如下所示:

user1 Premium
user2 Mod
user3 default
Mod
default
Admin
public class MyYamlFile {
    @JsonProperty
    private List<User> users;
    @JsonProperty
    private List<Group> groups;

    // getter methods ommitted
}
File file = new File("path/to/my/yaml/usersAndGroups.yaml");
不要忘记枚举条目区分大小写。所以“高级”不起作用。 您可以用这种方式构建所有模型类。每个子条目都应该有自己的模型类

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

public MyYamlFile readYaml(final File file) {
    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
    return mapper.readValue(file, MyYamlFile.class);
}
正如你所看到的,这个部分非常整洁,因为你不需要太多。文件实例包含YAML文件。您可以这样创建一个:

user1 Premium
user2 Mod
user3 default
Mod
default
Admin
public class MyYamlFile {
    @JsonProperty
    private List<User> users;
    @JsonProperty
    private List<Group> groups;

    // getter methods ommitted
}
File file = new File("path/to/my/yaml/usersAndGroups.yaml");
readValue
方法不支持
File
InputStream
java.io.Reader
String
(包含全部内容),
java.net.URL
和字节数组。 你应该找到适合你的东西

(*)你应该考虑改变YAML文件的结构,因为我认为不可能用杰克逊使用动态键(也许有人知道更多):


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

将yaml文件加载到
对象
,然后加载到
映射
,然后将
映射
的结果拆分为
字符串[]
,然后在
for
循环中,我从
字符串[]
读取名称。我对小组也这样做

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


谢谢大家的回复

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

感谢您让我了解Jacksons Yaml模块。一个问题是,我不可能更改yaml文件,它是在另一个应用程序中创建的,我只想阅读它。也许无论如何都可以使用这个模块?@Kristoferisakson是的,你可以试试。阅读这个问题的答案:作为一个例子。您将需要另一个类,该类将整个文件作为
列表
user1
将是该地图中“某处”的一个键。如何读入地图地图:
public map ReadyML(最终文件){final ObjectMapper mapper=new ObjectMapper(new YAMLFactory());return mapper.readValue(File,map.class);}
@MarcinGołębski如果您想这样做,那么您可以,
ObjectMapper
应该能够为您做到这一点。但这将使从数据中访问单个项目变得更加困难。