C# yaml 配置文件的用法(一)
目录
一、简介
二、yaml 的符号
1.冒号
2.短横杆
3.文档分隔符
4.保留换行符
5.注释
6.锚点
7.NULL值
8.合并
一、简介
YAML(YAML Ain't Markup Language)是一种数据序列化标准,广泛用于配置文件、数据交换和存储。YAML的设计目标是易于阅读和编写,同时也易于机器解析和生成。以下是YAML的一些关键特点和用途的介绍:
-
简洁性:yaml 使用缩进和简洁的语法来表示数据结构,这使得它比 XML 或 Json 等格式更易于阅读和编写。
-
数据类型支持:yaml 支持多种数据类型,包括标量(如字符串、整数、浮点数)、序列(列表)、映射(字典)以及复杂的数据结构。
-
跨语言支持:yaml 可以被多种编程语言解析和生成,包括 Python、Ruby、Java、JavaScript 等,这使得它在不同系统间的数据交换中非常有用。
-
配置文件:yaml 常用于编写配置文件,因为它的人类可读性和灵活性使得配置管理变得简单。例如,Docker 和Kubernetes 都使用 yaml 来定义容器和集群的配置。
-
文档分离:yaml 支持文档分离,即一个文件中可以包含多个独立的 yaml 文档,每个文档由三个破折号(---)分隔。
-
引用和锚点:YAML允许使用引用和锚点来避免数据重复,这可以提高数据的可维护性和减少错误。
-
兼容性:YAML可以与JSON相互转换,这意味着YAML文件可以很容易地转换为JSON格式,反之亦然。
yaml 有以下基本规则:
1. 大小写敏感。
2. 使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格键,缩进的空格数不重要,只要元素左侧能对齐就可。
3.空格,在 value 的值前边必须有空格,否则读取时会报错,比如:name: jack,而不是 name:jack,键值对的冒号后面至少有一个空格。
4.引号,value 的值如果是字符串,可以用引号也可以不用,单引号和双引号都可以。
5. yaml 兼容 Json 的语法,插件 YamlDotNet 同样也可以读写 Json。
yaml 在读取性能上不如 Json,但在需要手写配置文件的时候,yaml 要比 Json 方便不少,不用添加那么多对称的大括号(花括号)和中括号(方括号),读起来也更简单易懂,并且在多个编程语言中都是通用的。
文章的第二部分:
C# yaml 配置文件的用法(二)-CSDN博客
二、yaml 的符号
这里只介绍几个常用的符号,这不是 yaml 所有运算符,有需要的可以参考官方文档 The Official YAML Web Site
在使用 C# 进行读写时,需要安装一个插件 YamlDotNet

YamlDotNet 是开源的,github 可以找到对应的源码。
1.冒号
( : )冒号用于键值对的分隔,冒号后必须跟一个空格
username: admin
password: 123456
C# 实例:
using System;
using System.Collections.Generic;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
name: zhangsan
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<Dictionary<string, object>>(yaml);string name = data["name"] as string;Console.WriteLine("名字:{0}", name);Console.ReadKey();}}
}
运行:

2.短横杆
( - )短横杆用于表示列表(数组)的开始
fruits: - Apple - Banana - Cherry
C# 实例:
using System;
using System.Collections.Generic;
using System.Linq;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
fruits: - Apple - Banana - Cherry
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<Dictionary<string, object>>(yaml);if (data.ContainsKey("fruits") && data["fruits"] is IList<object> fruitsList){string[] fruitsArray = fruitsList.Cast<string>().ToArray();Console.WriteLine(string.Join(", ", fruitsArray));}Console.ReadKey();}}
}
运行:

3.文档分隔符
使用三个连字符(---)表示一个YAML文档的开始,可选地使用三个点(...)表示文档的结束(但在实践中通常省略)。
---
# 第一个文档
username: admin
---
# 第二个文档
name: Project A
description: A new project
...
4.保留换行符
| 和 > 用于处理多行字符串,其中 | 保留字符串的换行符,而 > 将换行符转换为空格。
poem: | 胜日寻芳泗水滨,无边光景一时新。等闲识得东风面,万紫千红总是春。description: > 风和日丽之时游览在泗水之滨,无边无际的风光让人耳目一新。谁都可以看出春的面貌,万紫千红,到处都是百花开放的春景。
C# 实例:
using System;
using System.Collections.Generic;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
poem: | 胜日寻芳泗水滨,无边光景一时新。等闲识得东风面,万紫千红总是春。description: > 风和日丽之时游览在泗水之滨,无边无际的风光让人耳目一新。谁都可以看出春的面貌,万紫千红,到处都是百花开放的春景。
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<Dictionary<string, object>>(yaml);string poem = data["poem"] as string;Console.WriteLine(poem);Console.WriteLine("===============");string description = data["description"] as string;Console.WriteLine(description);Console.ReadKey();}}
}
运行:

5.注释
使用井号(#)进行单行注释。
#这是一个注释
username: admin
password: 123456 #密码
6.锚点
如果你有一个值需要在多个地方重复使用,可以使用 yaml 的锚点和别名功能来避免重复写入。锚点(&)用于标记一个节点,而别名(*)用于引用这个锚点。
比如下面的案例中,ip 这个值需要在很多的地方用到,我们就可以使用 &ip 来标记一个锚点,然后使用 *ip 来引用。
ipAddress: &ip '192.168.1.1'server1:name: 'Server 1'ip: *ipserver2:name: 'Server 2'ip: *ipserver3:name: 'Server 3'ip: *ip
C# 实例:
using System;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
ipAddress: &ip '192.168.1.1'
server1:name: 'Server 1'ip: *ip
server2:name: 'Server 2'ip: *ip
server3:name: 'Server 3'ip: *ip
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var config = deserializer.Deserialize<ServersConfig>(yaml);Console.WriteLine($"Server 1: Name = {config.Server1.Name}, IP = {config.Server1.Ip}");Console.WriteLine($"Server 2: Name = {config.Server2.Name}, IP = {config.Server2.Ip}");Console.WriteLine($"Server 3: Name = {config.Server3.Name}, IP = {config.Server3.Ip}");Console.ReadKey();}}
}public class Server
{public string Name { get; set; }public string Ip { get; set; }
}public class ServersConfig
{public string IpAddress { get; set; }public Server Server1 { get; set; }public Server Server2 { get; set; }public Server Server3 { get; set; }
}
运行:

由于 yaml 不支持字符串的拼接,只能在编程语言中自行合并,如果确实有这个需求的话,只能在 yaml 中使用编程语言更加方便的读取方式,比如数组,yaml 数组中也是支持使用瞄点的。
ipAddress: &ip 'http://192.168.1.1'
server1:name: 'Server 1'ip: [*ip,'/biz/getVersion']
server2:name: 'Server 2'ip: [*ip, '/biz/getName']
server3:name: 'Server 3'ip: [*ip, '/biz/getAge']
C# 实例:
using System;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
ipAddress: &ip 'http://192.168.1.1'
server1:name: 'Server 1'ip: [*ip,'/biz/getVersion']
server2:name: 'Server 2'ip: [*ip, '/biz/getName']
server3:name: 'Server 3'ip: [*ip, '/biz/getAge']
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var config = deserializer.Deserialize<ServersConfig>(yaml);Console.WriteLine($"Server 1: Name = {config.Server1.Name}, IP = {string.Join("", config.Server1.Ip)}");Console.WriteLine($"Server 2: Name = {config.Server2.Name}, IP = {string.Join("", config.Server2.Ip)}");Console.WriteLine($"Server 3: Name = {config.Server3.Name}, IP = {string.Join("", config.Server3.Ip)}");Console.ReadKey();}}
}public class Server
{public string Name { get; set; }public string[] Ip { get; set; }
}public class ServersConfig
{public string IpAddress { get; set; }public Server Server1 { get; set; }public Server Server2 { get; set; }public Server Server3 { get; set; }
}
运行:

7.NULL值
可以用 ~ 或 null 来表示空值。例如:
value: ~
another_value: null
C# 实例:
using System;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;namespace yaml_test
{internal class Program{static void Main(string[] args){string yaml =
@"
value: ~
another_value: null
";var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();var data = deserializer.Deserialize<dynamic>(yaml);string value = data["value"];string another_value = data["another_value"];Console.WriteLine("value:{0}", value);Console.WriteLine("another_value:{0}", another_value);Console.ReadKey();}}
}
运行:

断点看看

8.合并
<< 是一个合并的语法,用于将一个映射(字典)的内容合并到另一个映射中。这种语法通常与锚和别名一起使用,以便重用和继承。
defaults: &defaultsname: Johnage: 30person1:<<: *defaults # 合并 defaults 的内容location: USAperson2:<<: *defaults # 合并 defaults 的内容location: Canada
合并后的结构将是:
person1:name: Johnage: 30location: USAperson2:name: Johnage: 30location: Canada
由于插件 YamlDotNet 目前并不支持合并语法(<<),所以这里就不做演示了,但它不代表所有编程语言都不支持合并语法,在有些编程语言中它是支持的,比如:Python
文章的第二部:
C# yaml 配置文件的用法(二)-CSDN博客
相关文章:
C# yaml 配置文件的用法(一)
目录 一、简介 二、yaml 的符号 1.冒号 2.短横杆 3.文档分隔符 4.保留换行符 5.注释 6.锚点 7.NULL值 8.合并 一、简介 YAML(YAML Aint Markup Language)是一种数据序列化标准,广泛用于配置文件、数据交换和存储。YAML的设计目标是…...
人工智能与机器学习原理精解【4】
文章目录 马尔科夫过程论要点理论基础σ代数定义性质应用例子总结 马尔可夫过程概述一、马尔可夫过程的原理二、马尔可夫过程的算法过程三、具体例子 马尔可夫链的状态转移概率矩阵一、确定马尔可夫链的状态空间二、收集状态转移数据三、计算转移频率四、构建状态转移概率矩阵示…...
Go channel实现原理详解(源码解读)
文章目录 Go channel详解Channel 的发展Channel 的应用场景Channel 基本用法Channel 的实现原理chan 数据结构初始化sendrecvclose使用 Channel 容易犯的错误总结Go channel详解 Channel 是 Go 语言内建的 first-class 类型,也是 Go 语言与众不同的特性之一。Channel 让并发消…...
数据结构-C语言-排序(4)
代码位置: test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言: 1.1-排序定义: 排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序) 1.2-排…...
灰色关联分析【系统分析+综合评价】
系统分析: 判断哪个因素影响最大 基本思想:根据序列曲线几何形状的相似程度来判断其练习是否紧密 绘制统计图并进行分析 确定子序列和母序列 对变量进行预处理(去量纲、缩小变量范围) 熟练使用excel与其公式和固定(…...
linux 部署flask项目
linux python环境安装: https://blog.csdn.net/weixin_41934979/article/details/140528410 1.创建虚拟环境 python3.12 -m venv .venv 2.激活环境 . .venv/bin/activate 3.安装依赖包(pip3.12 install -r requirements.txt) pip3.12 install -r requirements.txt 4.测试启…...
ES6 数值的扩展(十八)
1. 二进制和八进制字面量 特性:可以直接在代码中使用二进制(0b 或 0B)和八进制(0o 或 0O)字面量。 用法:简化二进制和八进制数值的表示。 const binaryNumber 0b1010; // 二进制表示 10 const octalNumb…...
面试知识储备-redis和redission
1.redis的使用 引入依赖,自动注解redistemplate即可使用, 默认的redistemplate存入到redis中是字符流的形式,需要配置redistemplate, 如果不想配置,可以使用stringRedistemplate 可以使用string类型,但是…...
【5本可选】保证知网检索,现在投稿可在8月见刊,对文科领域友好
AEPH出版社旗下有5本学术期刊,专门出版自然科学、社会科学研究与教育领域论文的高影响力期刊,拥有正规ISSN号,出版类型涉及应用和理论方面的原创和未曾公开发表的研究论文,分配独立DOI号。 期刊1 Philosophy and Social Science…...
SpringBoot入门:如何新建SpringBoot项目(保姆级教程)
在本文中,我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的,因为我发现有些java的初学者,甚至工作10年的老员工居然并不会新建一个SpringBoot项目,所以特别出了一篇文章来教大家新建一个SpringBoo…...
数据恢复篇:适用于 Android 视频恢复的 6 个工具
在智能手机这个动态的世界里,每一刻都被捕捉并以数字方式存储,丢失珍贵的视频可能是一种令人心碎的经历。不必担心,因为 Android 生态系统提供了大量旨在挽救这些珍贵回忆的视频恢复应用程序。 这些应用程序是强大的工具,旨在挽救…...
Android笔试面试题AI答之控件Views(6)
答案来着文心一言,仅供参考 目录 1.简述什么是RemoteViews?使用场景有哪些?RemoteViews的特性使用场景总结 2.获取View宽高的几种方法?1. 在onWindowFocusChanged方法中获取2. 使用ViewTreeObserver.OnGlobalLayoutListener3. 使用ViewTreeObserver.OnPreDrawLi…...
扭蛋机潮玩小程序搭建,扭蛋机行业的创新
在当下潮玩市场中,扭蛋机具有盲盒的未知性和惊喜体验感,商品丰富,并且价格相对低廉,获得了极高的人气。年轻人开始对扭蛋机逐渐“上头”,为了扭到喜欢的商品不断地进行复购下单,在这场随机性的扭蛋游戏中&a…...
supOS赋能千行百业
推进制造业数字化转型是促进数字经济和实体经济深度融合的重点领域。在长期摸索和实践过程中,蓝卓打造了工厂操作系统、行业云操作系统、产业大脑操作系统三大产品,形成了企业侧、行业侧、产业侧的立体化赋能体系,全面赋能工业企业࿰…...
Vue中filter的使用
在 Vue.js 中,filter() 方法用于创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。filter() 不会改变原数组,而是返回一个新的数组。 语法 array.filter(callback(element[, index[, array]])[, thisArg])callback:…...
案例研究|柯尼卡美能达软件开发(大连)有限公司基于DataEase构筑内部数据可视化体系
柯尼卡美能达软件开发(大连)有限公司于2007年5月25日注册成立。公司以“洞悉在工作的人们真实情况,探寻他们的愿望,持续提供使人们更加幸福的服务”为使命,致力于系统品质测试服务、软件开发服务、IT安全服务、高级BPO…...
PHP框架详解- symfony框架
文心一言 Symfony框架是一个用PHP语言编写的开放源代码的Web应用框架,旨在加速Web应用程序的开发过程,提高代码的可维护性和可扩展性。以下是对Symfony框架的详细解析: 一、框架概述 起源与开发者: Symfony由SensioLabs&#…...
springboot系列十一:Thymeleaf
文章目录 官方文档基本介绍Thymeleaf机制说明Thymeleaf语法表达式运算符th属性迭代条件运算使用Thymeleaf th属性需要注意点 Thymeleaf综合案例需求说明思路分析代码实现 作业布置 官方文档 在线文档: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 离线…...
51单片机嵌入式开发:12、STC89C52RC 红外解码数码管显示
STC89C52RC 红外解码数码管显示 1 概述2 HX1838原理2.1 原理概述2.2 原理概述 3 HX1838代码实现3.1 工程整理3.2 工程代码3.3 演示 4 HX1838总结 1 概述 HX1838是一种常见的红外接收模块,用于接收和解码红外遥控器发送的红外信号。 HX1838具有以下特点和功能&#…...
数据结构--二叉树详解
一,概念 1,结点的度:一个结点含有子树的个数称为该结点的度 2, 树的度:一棵树中,所有结点度的最大值称为树的度; 3,叶子结点或终端结点:度为0的结点称为叶结点&#x…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
