Java 和 YAML:如何解析多个 yaml 文档并将它们合并为单个 YAML 表示?
Posted
技术标签:
【中文标题】Java 和 YAML:如何解析多个 yaml 文档并将它们合并为单个 YAML 表示?【英文标题】:Java and YAML: how to parse multiple yaml documents and merge them to a single YAML representation? 【发布时间】:2014-12-08 07:47:01 【问题描述】:假设我有一个文件,defaults.yaml
:
pool:
idleConnectionTestPeriodSeconds: 30
idleMaxAgeInMinutes: 60
partitionCount: 4
acquireIncrement: 5
username: dev
password: dev_password
还有另一个文件,production.yaml
:
pool:
username: prod
password: prod_password
在运行时,我如何读取这两个文件并将它们合并为一个,以便应用程序“看到”以下内容?
pool:
idleConnectionTestPeriodSeconds: 30
idleMaxAgeInMinutes: 60
partitionCount: 4
acquireIncrement: 5
username: prod
password: prod_password
这可以通过 SnakeYAML 实现吗?还有其他工具吗?
我知道一种选择是将多个文件作为 Maps 读取,然后自己合并它们,将合并呈现为单个临时文件,然后读取它,但这是一个重量级的解决方案。现有工具可以做到这一点吗?
【问题讨论】:
我认为现有的工具不会做任何比你想做的更“重量级”的事情——不过,另一种选择是跳过临时文件,只在内存中合并地图。 【参考方案1】:您可以使用 Jackson,关键是使用 ObjectMapper.readerForUpdating() 并使用 @JsonMerge 注释字段(否则下一个对象中所有缺少的字段将覆盖旧的):
马文:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.9.9</version>
</dependency>
代码:
public class TestJackson
public static void main(String[] args) throws IOException
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
MyConfig myConfig = new MyConfig();
ObjectReader objectReader = mapper.readerForUpdating(myConfig);
objectReader.readValue(new File("misc/a.yaml"));
objectReader.readValue(new File("misc/b.yaml"));
System.out.println(myConfig);
@Data
public static class MyConfig
@JsonMerge
private Pool pool;
@Data
public static class Pool
private Integer idleConnectionTestPeriodSeconds;
private Integer idleMaxAgeInMinutes;
private Integer partitionCount;
private Integer acquireIncrement;
private String username;
private String password;
【讨论】:
终于!五年后的答案!!! :) 它仍然受到赞赏 - 答案被授予。谢谢!以上是关于Java 和 YAML:如何解析多个 yaml 文档并将它们合并为单个 YAML 表示?的主要内容,如果未能解决你的问题,请参考以下文章
在Jackson的单个文件中反序列化来自多个YAML文档的POJO