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

Nir*_*jan 10 java yaml snakeyaml

我是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
Run Code Online (Sandbox Code Playgroud)

我必须解析以下Map结构

+==================================+
| Key              |               |
+==================================+
| authentication   | AuthConfig    |
+----------------------------------+
| service1         | ServiceConfig |
+----------------------------------+
| service2         | ServiceConfig |
+----------------------------------+
Run Code Online (Sandbox Code Playgroud)

AuthConfig并且ServiceConfig是我们系统中的自定义对象.

有人可以提供一些提示怎么做?

Ale*_*lor 6

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

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Run Code Online (Sandbox Code Playgroud)

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

ApplicationCatalog catalog = mapper.readValue(yamlSource, ApplicationCatalog.class);
Run Code Online (Sandbox Code Playgroud)

您可以设置类似这样的类(为了方便起见,我已将所有内容公开):

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 {
  ...
}
Run Code Online (Sandbox Code Playgroud)

请注意JsonProperty 注释,它将Java字段重命名为YAML字段.我发现这是在Java中处理JSON和YAML最方便的方法.我还必须使用流API来实现大型对象.

  • 顺便说一句,杰克逊实际上是在YAML的引擎盖下使用SnakeYAML. (2认同)