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
是我们系统中的自定义对象.
有人可以提供一些提示怎么做?
有一个名为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来实现大型对象.