Enums 使用SnakeYAML按值解析枚举

Enums 使用SnakeYAML按值解析枚举,enums,yaml,snakeyaml,Enums,Yaml,Snakeyaml,如中所述,从中可以看出,SnakeYAML通过枚举的名称来处理枚举。我想要的是按枚举值解析值,例如: 枚举: 亚马尔: 原因是我们的代码风格迫使我们对枚举常量使用大写,而我希望yaml文件中的数据保持小写。据我所知,这是不可能的。枚举常量是私有的,因此其他类无法访问,因此YAML解析器将无法构造对象 虽然不是完美的,但您可以使用创建枚举的昵称 还有另一种方法可以做到这一点。可能它不干净,但工作正常 通过扩展org.yaml.snakeyaml.Constructor.Constructor创

如中所述,从中可以看出,SnakeYAML通过枚举的名称来处理枚举。我想要的是按枚举值解析值,例如:

枚举:

亚马尔:


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

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


虽然不是完美的,但您可以使用创建枚举的昵称

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

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

  • 嗯,有趣的概念。好的,对于枚举,如果SnakeYAML内部有这个处理,那么就可以使用
    valueOf
    方法。我想让你看看是否可以在另一个yaml文件中包含一个yaml文件,所以在一个yaml中定义所有别名,然后将其包含在所有其他文件中,以便隐藏别名。不幸的是,这是不可能的:(我认为您只需要处理yaml中的大写字母。或者只是将它们解析为字符串,或者在代码中转换为枚举。我也建议这样做。只需将它们存储为字符串,然后将它们转换为java对象中的枚举:)我还想知道您是否可以让snakeyaml使用除
    valueOf(…)
    之外的方法,但后来我发现这篇文章:听起来几乎不可能。但是,是的,如果你想保持小写,我会将它们存储为字符串,然后在加载时解析它们。。。我从上游snakeyaml存储库创建了fork,并添加了配置区分大小写的功能。我正在等待拉取请求的批准,并将其添加到主分支。我的拉取请求已被接受。它将以1.28版交付
    public enum Strategy {
        ALWAYS_RUN("always-run"),
        ALWAYS_SKIP("always-skip"),
        DEPENDS("depends");
        ...
    }
    
    branches:
      trunk: always-skip
      bugfix: depends
      default: always-run