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…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...