【问题标题】:Parse a YAML file解析 YAML 文件
【发布时间】: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?

我想,我需要将信息保存在我可以轻松迭代的内容中。

【问题讨论】:

    标签: java yaml


    【解决方案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");
    

    除了FilereadValue 方法还支持InputStreamjava.io.ReaderString(包含全部内容)、java.net.URL 和字节数组。 你应该找到适合你的东西。

    (*) 您应该考虑更改 YAML 文件的结构,因为我认为 Jackson 无法使用动态密钥(也许有人对此了解更多):

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

    【讨论】:

    • 感谢您让我知道 Jacksons YAML 模块。一个问题是我无法更改 yaml 文件,它是在另一个应用程序中创建的,我只是要阅读它。也许无论如何都可以使用这个模块?
    • @KristofferIsaksson 是的,你可以试试。阅读这个问题的答案:以stackoverflow.com/questions/17685508/… 为例。您将需要另一个将整个文件作为List&lt;Map&lt;String, String&gt;&gt; 的类。 user1 将是该地图中“某处”的关键。
    • 读入地图地图怎么样:public Map&lt;String,?&gt; 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 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 2020-10-14
        • 2020-07-18
        • 1970-01-01
        • 2018-08-04
        相关资源
        最近更新 更多