解析 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");
除了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:
....
【讨论】:
感谢您让我知道 Jacksons YAML 模块。一个问题是我无法更改 yaml 文件,它是在另一个应用程序中创建的,我只是要阅读它。也许无论如何都可以使用这个模块? @KristofferIsaksson 是的,你可以试试。阅读这个问题的答案:以***.com/questions/17685508/… 为例。您将需要另一个将整个文件作为List<Map<String, String>>
的类。 user1
将是该地图中“某处”的关键。
读入地图地图怎么样:public Map<String,?> 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 文件的主要内容,如果未能解决你的问题,请参考以下文章