使用SnakeYAML解析YAML:ID与Host映射及取值方法咨询
YAML配置与Java解析的映射问题解答
1. YAML中的id与host是否已建立映射关系?
假设你当前的YAML是常见的列表结构(比如每个元素包含id和host两个属性):
servers: - id: abc host: abc.com - id: def host: def.com
这种情况下,id和host只是同个对象的两个属性,并没有建立键值映射关系——它们属于同一个实例,但没有把id作为键、host作为值的Map结构。
2. 若已映射,如何根据id获取对应的host值?
如果你的YAML已经是Map结构(直接将id作为键):
servers: abc: abc.com def: def.com
在Java里只需把对应Model的字段定义为Map<String, String>,解析后直接通过map.get("abc")就能拿到abc.com。
如果是解析后通过自定义逻辑建立映射,可将解析得到的列表转成Map:
// 假设已解析得到List<Server> serverList Map<String, String> idHostMap = serverList.stream() .collect(Collectors.toMap(Server::getId, Server::getHost)); // 根据id取值 String host = idHostMap.get("abc");
3. 若未映射,如何修改YAML为Map结构并根据键读取对应值?
修改YAML结构
把原列表结构改成键值对形式:
# 原无映射的列表结构 servers: - id: abc host: abc.com - id: def host: def.com # 修改后的Map映射结构 servers: abc: abc.com def: def.com
如果需要保留更多属性(如端口),可使用嵌套Map:
servers: abc: host: abc.com port: 8080 def: host: def.com port: 8081
修改Java代码
- 对应Model类调整字段类型:
// 简单键值对(id->host)场景 @Data @ConfigurationProperties(prefix = "servers") public class ServerConfig { private Map<String, String> servers; } // 多属性嵌套场景 @Data public class ServerDetail { private String host; private Integer port; } @Data @ConfigurationProperties(prefix = "servers") public class ServerConfig { private Map<String, ServerDetail> servers; } - 取值时直接通过Map的key获取:
// 简单场景取值 String abcHost = serverConfig.getServers().get("abc"); // 多属性场景取值 String abcHost = serverConfig.getServers().get("abc").getHost(); Integer abcPort = serverConfig.getServers().get("abc").getPort();
内容的提问来源于stack exchange,提问作者user2315104
相关产品推荐
相关产品推荐

