使用SnakeYAML按值分析枚举值

时间:2014-08-01 11:33:49

标签: enums yaml snakeyaml

正如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文件中的数据保持为小写。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我知道已经过了几年,但是自Jackson databind enum case insensitive

起在这里得到了回答。

答案 2 :(得分:0)

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

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