如何使用YamlDotNet仅解析YAML文档中的指定部分配置?
实现方案
核心逻辑是先通过YAML结构化文档模型定位到config_one节点,再单独对该节点执行强类型反序列化,全程不会读取config_two节点的内容,自然实现完全忽略的效果。
实现步骤
- 引入YamlDotNet对应功能的命名空间
using YamlDotNet.RepresentationModel; using YamlDotNet.Serialization; using System.IO; - 将原始YAML文本加载为通用文档结构,不直接反序列化到自定义业务类
- 从文档根层级的映射结构中,检索出
config_one对应的子节点 - 通过YamlDotNet反序列化器,将目标子节点转换为预先定义的
ConfigOne类实例
完整代码示例
// 原始YAML文本内容 string yamlRawContent = @" config_one: name: foo stuff: value config_two: name: bar random: value "; // 1. 加载YAML为结构化文档模型 YamlStream yamlStream = new YamlStream(); using (StringReader reader = new StringReader(yamlRawContent)) { yamlStream.Load(reader); } // 2. 获取文档根节点的键值映射结构 YamlMappingNode rootMapping = (YamlMappingNode)yamlStream.Documents[0].RootNode; // 3. 定位config_one节点,增加键存在判断避免异常 YamlScalarNode configOneKey = new YamlScalarNode("config_one"); if (!rootMapping.Children.ContainsKey(configOneKey)) { throw new InvalidDataException("YAML中未找到config_one配置节点"); } YamlNode configOneNode = rootMapping.Children[configOneKey]; // 4. 单独反序列化目标节点为ConfigOne类实例 IDeserializer deserializer = new DeserializerBuilder().Build(); ConfigOne parsedResult = deserializer.Deserialize<ConfigOne>(configOneNode); // 最终parsedResult的属性值:Name = "foo", Stuff = "value"
注意事项
- 该方案无需配置额外的字段忽略规则,因为解析流程完全不会触达
config_two节点的内容,相比全局反序列化后过滤字段的方式解析效率更高 - 如果YAML内容包含多份独立文档,只需调整
yamlStream.Documents的数组索引,指向需要解析的目标文档即可 - 反序列化阶段默认会自动匹配YAML键名和类的公开属性名,匹配规则不区分大小写,也可通过YamlDotNet内置的特性自定义映射规则
内容的提问来源于stack exchange,提问作者void.pointer
相关产品推荐
相关产品推荐

