这是我第一次使用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。
我想,我需要将信息保存在我很容易迭代的内容中。
答案 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
方法也支持InputStream
,java.io.Reader
,String
(包含全部内容),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);