web-dev-qa-db-ja.com

SnakeYamlでYAMLファイルの一部を解析する方法

私は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は、システムのカスタムオブジェクトです。

誰かがそれを行う方法のヒントを提供できますか?

11
Niranjan

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を処理する最も便利な方法だと思います。また、非常に大きなオブジェクトには ストリーミングAPI を使用する必要がありました。

6
Alex Taylor