我是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 |
+----------------------------------+
AuthConfig
和ServiceConfig
是我们系统中的自定义对象。
有人可以提供一些提示吗?
答案 0 :(得分:6)
有一个名为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用于非常大的对象。
答案 1 :(得分:-2)
因为您在Auth和Service配置中具有相同的属性,所以我在一个类中对其进行了简化,以便向您展示。
YamlConfig类看起来像这样:
public class YamlConfig {
private Map<String, ServiceConfig> applications;
//... getter and setters here
}
Parser逻辑是这样的:
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