Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SnakeYaml中解析YAML文件的一部分_Java_Yaml_Snakeyaml - Fatal编程技术网

Java 如何在SnakeYaml中解析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

我是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
是我们系统中的自定义对象


有人能提供一些如何做的提示吗?

有一个名为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);