【问题标题】:Parse Enum by value using SnakeYAML使用 SnakeYAML 按值解析枚举
【发布时间】:2014-09-24 14:30:01
【问题描述】:

正如在docs 中所指定的以及从source code 中看到的那样,SnakeYAML 按其名称处理枚举。我想要的是按枚举值解析值,例如:

枚举:

public enum Strategy {
    ALWAYS_RUN("always-run"),
    ALWAYS_SKIP("always-skip"),
    DEPENDS("depends");
    ...
}

YAML:

branches:
  trunk: always-skip
  bugfix: depends
  default: always-run

原因是我们的代码风格迫使我们对枚举常量使用大写,而我想将 yaml 文件中的数据保持小写。

【问题讨论】:

    标签: enums yaml snakeyaml


    【解决方案1】:

    还有另一种方法可以做到这一点。可能它不干净但工作正常。

    1. 通过扩展 org.yaml.snakeyaml.constructor.Constructor 创建一个新的 Constructor 类。
    2. 在其中创建一个ScalarConstuctorprotected class,其代码实现与基类ScalarConstructor 中的代码实现相同,但枚举解析实现除外。
    3. 在方法 constructStandardJavaInstance 中检查是否存在具有大写或小写名称的 enum
    4. 最后用构造函数创建Yaml对象(步骤1)

    【讨论】:

    • 为了后代...我从上游 snayaml 存储库创建了 fork,并添加了配置区分大小写的功能 - github.com/asomov/snakeyaml/pull/14。我正在等待拉取请求的批准并将其添加到主分支
    • 我的拉取请求已被接受。它将在 1.28 版本中交付
    【解决方案2】:

    据我所知,这是不可能的。枚举常量是私有的,因此其他类无法访问,因此 YAML 解析器将无法构造对象。

    虽然不完美,但您可以使用aliases 为枚举创建昵称。

    【讨论】:

    • 嗯,有趣的概念。好吧,对于枚举,可以使用 valueOf 方法,只要 SnakeYAML 在内部进行此处理。
    • 我正在找你看看你是否可以在另一个 yaml 文件中包含一个 yaml 文件,所以在一个 yaml 中定义所有别名,然后将它包含在所有其他文件中,以便隐藏别名。不幸的是,这是不可能的:(我认为你只需要在你的 yaml 中处理大写。
    • 或者只是将它们解析为字符串,并可能在代码中转换为枚举
    • 我也打算推荐一个。只需将它们存储为字符串,然后将它们转换为 java 对象中的枚举 :)
    • 我也想知道您是否可以让snakeyaml 使用valueOf(...) 以外的方法,但后来我发现了这篇文章:groups.google.com/forum/#!topic/snakeyaml-core/iNMU_9nH90s 听起来几乎不可能。但是,是的,如果你想让它保持小写,我会将它们存储为字符串,然后在加载它们时解析它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多