当前位置: 首页 > 知识库问答 >
问题:

使用SnakeYAML按值解析枚举

苍和裕
2023-03-14

正如文档中指定并从源代码中看到的那样,SnakeYAML通过其名称处理枚举。我想要的是按枚举值解析值,例如:

枚举:

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

亚马尔:

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

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

共有2个答案

孙化
2023-03-14

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

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

喻元龙
2023-03-14

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

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

 类似资料:
  • 问题内容: 我正在尝试解析相同的JSON,但是现在我对类进行了一些更改。 我的班级现在看起来像: 此代码引发异常, 可以理解,因为按照我上一个问题的解决方案,GSON希望将Enum对象实际创建为 但是,由于从语法上讲这是不可能的,因此推荐的解决方案和解决方法是什么? 问题答案: 从Gson的文档中: Gson为枚举提供了默认的序列化和反序列化…如果您想更改默认的表示形式,则可以通过GsonBuil

  • 文档中只有嵌套在其他对象中的映射/集合的示例,因此您可以执行以下操作: 但是,当地图格式位于文档的根目录时,如何定义它呢?

  • 我试图将上面的文件加载到一个映射中,实体部分下的数据将映射到实体对象的集合。当我得到yaml解析器错误时,这是正确的yaml语法吗。

  • 在angular 12应用程序上,我有enum: 我尝试如下定义Policy类型的变量: < code>route.data.policy的类型是< code>any。但是我得到了错误: 元素隐式具有“任何”类型,因为索引表达式不是“数字”类型。 如何将route.data.policy的值解析为枚举的< code>'Admin'或< code>'Manager'?

  • 将grpc与Node一起使用,对我的查询的响应中的枚举将解析为整数值。但是,当我使用BloomRPC进行相同的查询时,枚举将解析为整数值。 是否有参数或选项可以强制使用Node grpc将这些枚举解析为字符串?

  • 问题内容: 我想将YAML文档读取到自定义对象的映射(而不是map,默认情况下snakeYaml会这样做)。所以这: 将被加载到如下所示的地图中: 其中项目是: 我找不到使用snakeYaml做到这一点的方法,也找不到适合该任务的更好的库。 该文档仅包含将地图/集合嵌套在其他对象中的示例,因此您可以执行以下操作: 但是,当地图格式位于文档的根目录时,该如何定义呢? 问题答案: 您需要添加一个自定义