Java 如何在SnakeYaml中解析YAML文件的一部分
我是YAML新手,解析了一个YAML配置文件,如下所示:Java 如何在SnakeYaml中解析YAML文件的一部分,java,yaml,snakeyaml,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
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
是我们系统中的自定义对象
有人能提供一些如何做的提示吗?有一个名为Java的包,用于处理(JSON、CSV和XML)和Java对象之间的映射。您将遇到的大多数示例都是针对JSON的,但是YAML链接表明切换是直接进行的。所有内容都要经过
对象映射器:
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
然后可用于通过反射反序列化对象:
ApplicationCatalog catalog = mapper.readValue(yamlSource, ApplicationCatalog.class);
您可以这样设置您的类(为了便于示例,我已经公开了所有内容):
注意JsonProperty,它将Java字段重命名为YAML字段。我发现这是在Java中处理JSON和YAML最方便的方法。我还必须对非常大的对象使用
YamlConfig类如下所示:
public class YamlConfig {
private Map<String, ServiceConfig> applications;
//... getter and setters here
}
我在本文中分享了完整的代码:可能不是一个有效的答案,但您可以使用YamlBeans:这似乎更好地记录了这个项目已经转移到GitHub,在那里他们几乎没有文档。事实上,这些文件比SnakeYaml更糟糕。我可能在这里遗漏了一些东西,但是你有YamlBeans文档的链接吗?是的,它已经被移动了:在Github自述中,有一个关于你想做什么的解释。顺便说一句,Jackson实际上在YAML的引擎盖下使用了SnakeYAML。谢谢你的回复;我知道杰克逊的API。我们将此用于REST服务。我也知道jackson yml套餐。但我不想在snakeyml库上使用另一个包装器。一旦我找到了一个令人信服的解决方案,我就会发帖。无论如何,感谢您的帮助。看来这确实是最方便的解决方案,谢谢!这是修改代码的示例,而不是OP的原始请求。OP的YAML文件使用破折号(-)作为分隔符,而您的文件使用camelCase。
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);