如何在 SnakeYaml 中解析 YAML 文件的一部分

Posted

技术标签:

【中文标题】如何在 SnakeYaml 中解析 YAML 文件的一部分【英文标题】:How to parse part of a YAML file in SnakeYaml 【发布时间】:2016-05-15 00:46:39 【问题描述】:

我是 YAML 新手,我解析了一个 YAML 配置文件,如下所示:

applications:
  authentication:
    service-version: 2.0
    service-url: https://myapp.corp/auth
    app-env: DEV
    timeout-in-ms: 5000
    enable-log: true

  service1:
    enable-log: true
    auth-required: true
    app-env: DEV
    timeout-in-ms: 5000
    service-url: https://myapp.corp/service1
    service-name: SomeService1
    service-version: 1.1
    service-namespace: http://myapp.corp/ns/service1

  service2:
    enable-log: true
    auth-required: true
    app-env: DEV
    timeout-in-ms: 5000
    service-url: https://myapp.corp/service2
    service-name: SomeService2
    service-version: 2.0
    service-namespace: http://myapp.corp/ns/service2

我必须解析为遵循Map 结构

+==================================+
| Key              |               |
+==================================+
| authentication   | AuthConfig    |
+----------------------------------+
| service1         | ServiceConfig |
+----------------------------------+
| service2         | ServiceConfig |
+----------------------------------+

AuthConfigServiceConfig 是我们系统中的自定义对象。

有人可以提供一些提示吗?

【问题讨论】:

也许不是一个有效的答案,但您可以改用 YamlBeans:yamlbeans.sourceforge.net 似乎有更好的记录 这个项目已经移到了 GitHub,那里的文档很少。事实上,文档比 SnakeYaml 更糟糕。我可能在这里遗漏了一些东西,但是你有 YamlBeans 文档的链接吗? 是的,它已经被移动了:github.com/EsotericSoftware/yamlbeans 在 Github README 中有一个关于你想要做什么的解释。 【参考方案1】:

有一个名为Jackson 的Java 包处理YAML(以及JSON、CSV 和XML)与Java 对象之间的映射。您将遇到的大多数示例都是针对 JSON 的,但 YAML 链接显示切换是直截了当的。一切都通过ObjectMapper

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

然后可用于通过反射反序列化您的对象:

ApplicationCatalog catalog = mapper.readValue(yamlSource, ApplicationCatalog.class);

你会像这样设置你的类(为了便于举例,我将所有内容都公开了):

class ApplicationCatalog 
  public AuthConfig authentication;
  public ServiceConfig service1;
  public ServiceConfig service2;


class AuthConfig 
  @JsonProperty("service-version")
  public String serviceVersion;
  @JsonProperty("service-url")
  public String serviceUrl;
  @JsonProperty("app-env")
  public String appEnv;
  @JsonProperty("timeout-in-ms")
  public int timeoutInMs;
  @JsonProperty("enable-log")
  public boolean enableLog;


class ServiceConfig 
  ...

注意 JsonProperty annotation 将您的 Java 字段重命名为 YAML 字段。我发现这是在 Java 中处理 JSON 和 YAML 的最方便的方法。对于非常大的对象,我还必须使用 streaming API。

【讨论】:

顺便说一句,Jackson 实际上在 YAML 的底层使用了 SnakeYAML。 感谢回复;我知道杰克逊 API。我们将它用于我们的 REST 服务。我也知道 jackson-yml 包。但是我不想在snakeyml lib上使用另一个包装器。一旦找到令人信服的解决方案,我将发布。无论如何,感谢您的帮助。 看来这确实是最方便的解决方案,谢谢!【参考方案2】:

因此,由于您在 Auth 和 Service 配置中具有相同的属性,因此我将其简化为一个类以在此处向您展示。

YamlConfig 类如下所示:

public class YamlConfig 

  private Map<String, ServiceConfig> applications;

  //... getter and setters here

解析器逻辑是这样的:

Yaml yaml = new Yaml(new Constructor(YamlConfig.class));
InputStream input = new FileInputStream(new File("/tmp/apps.yml"));
YamlConfig data = yaml.loadAs( input, YamlConfig.class);

我在这个要点中分享了完整的代码:https://gist.github.com/marceldiass/f1d0e25671d7f47b24271f15c1066ea3

【讨论】:

这是修改代码的示例,而不是 OP 的原始请求。 OP 的 YAML 文件使用破折号( - )作为分隔符,而您的使用的是 camelCase。

以上是关于如何在 SnakeYaml 中解析 YAML 文件的一部分的主要内容,如果未能解决你的问题,请参考以下文章

无法解析类org.yaml.snakeyaml.Yaml @Grab('org.yaml:snakeyaml:1.17')Jenkins管道

如何解决snakeyaml NoSuchMethodError:getStyle()

SnakeYAML:解析时如何禁用下划线剥离?

如何使用 snakeYaml 库访问 YAML 文件中的内部(嵌套)键值

在 Java 中解析 YAML 前端

如何在 YAML 文件中为简单的 POJO 定义映射?