如何在 SnakeYaml 中解析 YAML 文件的一部分
Posted
技术标签:
【中文标题】如何在 SnakeYaml 中解析 YAML 文件的一部分【英文标题】:How to parse part of a YAML file in SnakeYaml 【发布时间】:2016-05-15 00:46:39 【问题描述】:我是 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
是我们系统中的自定义对象。
有人可以提供一些提示吗?
【问题讨论】:
也许不是一个有效的答案,但您可以改用 YamlBeans:yamlbeans.sourceforge.net 似乎有更好的记录 这个项目已经移到了 GitHub,那里的文档很少。事实上,文档比 SnakeYaml 更糟糕。我可能在这里遗漏了一些东西,但是你有 YamlBeans 文档的链接吗? 是的,它已经被移动了:github.com/EsotericSoftware/yamlbeans 在 Github README 中有一个关于你想要做什么的解释。 【参考方案1】:有一个名为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。
【讨论】:
顺便说一句,Jackson 实际上在 YAML 的底层使用了 SnakeYAML。 感谢回复;我知道杰克逊 API。我们将它用于我们的 REST 服务。我也知道 jackson-yml 包。但是我不想在snakeyml lib上使用另一个包装器。一旦找到令人信服的解决方案,我将发布。无论如何,感谢您的帮助。 看来这确实是最方便的解决方案,谢谢!【参考方案2】:因此,由于您在 Auth 和 Service 配置中具有相同的属性,因此我将其简化为一个类以在此处向您展示。
YamlConfig 类如下所示:
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);
我在这个要点中分享了完整的代码:https://gist.github.com/marceldiass/f1d0e25671d7f47b24271f15c1066ea3
【讨论】:
这是修改代码的示例,而不是 OP 的原始请求。 OP 的 YAML 文件使用破折号( - )作为分隔符,而您的使用的是 camelCase。以上是关于如何在 SnakeYaml 中解析 YAML 文件的一部分的主要内容,如果未能解决你的问题,请参考以下文章
无法解析类org.yaml.snakeyaml.Yaml @Grab('org.yaml:snakeyaml:1.17')Jenkins管道
如何解决snakeyaml NoSuchMethodError:getStyle()