摘要
本文主要一并介绍一些标记类语法,具体而言是 JSON,yaml,xml 三种语言的语法介绍。
JSON
本质:数据格式
json 不是一种编程语言或者技术,而是一种传递数据的格式,这从他的命名之间就能看出来:JavaScript Object Notation。以面向复杂结构为主,相对于直接使用字符串的简单类型,JSON 以对象-成员的基本编写逻辑组合数据,所以 JSON 导入之后就是一个对象(结构体+语言提供的解析方法)。
类型
JSON 支持以下几种类型(作为值):
- 数字
- 字符串,使用双引号表示
- 布尔
- null
- 对象:使用一对大括号包裹
- 上述内容的数组:使用方括号包裹。内部是键值对(“键”: 值)
格式
键值对规定:
- 键值一定是字符串,也就是以"键": 值 的格式进行
- 键值对之间使用逗号分割,最后一个不适用逗号
- JSON 不支持任何形式的注释
整体的格式要求
- 整体的 json 只有一个顶层对象,也就是所有的内容都在一个根元素以内,不能存在第二个顶层元素。
形式化的递归定义:
- json 支持四种基本的数据形式:数字,字符串,布尔
- json 的基本组成单位是对象,最简单的对象是{}
- 使用键值对"key":value 的形式置入 json 四种基本值,也是合法对象
- 对象也是合法键值
- 上述的五种类型构成的数组也是合法键值
- 整个 json 文件只有一个对象组成
语法
JSON 主要涉及两个函数:Stringfy 和 parse, 绝大多数现代语言都实现了这两个方法,来实现对象到字符串的转换,此处以 js 为例。
const data={"name": "CH","gender": "male","age":99};
const pa=JSON.stringfy(data);
const res= data.parser(pa);
值得说的是,上述的解析是直接创建一个新的副本的,程序里的 data 和 res 是两个内容相同的不同内存块,而不是指向同一块内存的两个引用。
yaml
yaml 是一种人类可读的数据序列化格式
类型
- 字符串(引号可选)
- 数字(整数,浮点)
- 布尔
- null
- 日期
- 数组:缩进一层使用-表示每一个成员
- 嵌套结构
格式与语言规范
- 不同于 json 这种基于传统的大括号逻辑,yaml 是缩进逻辑,元素间的层级关系是通过缩进表示的,也可以在行内使用 json 语法
- 同样适用键值对格式,但是键不强制使用引号,编写方便。
- 没有 json 那种一定要顶部元素的设定,默认有一个外部包装,内部可以有若干个顶层成员
- 缩进之间支持嵌套
- 有跨行语法
- 使用#做注释
student:
- name : CH
age : 19
gender: man
- name : JQ
gender: woman
location : New York
workers:
- name : Alan Walker
jop : DJ
# 嵌套语法展示
multline : | # 类似raw字符串,保留格式
multline : > # 只是一种比较方便看长字符的格式,最后会折叠成一行
multline : |2 # 保留换行与缩进
multline : |- # 去掉尾换行,+是强制使用换行
反斜杠换行:对于长串,也可以使用反斜杠来折回来,便于阅读。
特殊的变量语法
yaml 没有 json 那么老实的直接有对应关系,而是引入了一些变量系统。称为锚点和别名
- 使用 &修饰符,将一种变量格式设置为别名
- 使用 *name 的格式使用(完整的不可修改的内容)
- << * name 是继承语法,会沿用原本的元素,使用堆叠式的复制,也就是不会覆盖掉已经声明的同名成员(注意这个不是所有解析器都支持)
- 也可以将一些字面值设置别名并使用锚点匹配
复杂键:yaml 的键值不是单纯地字符串,也可以是正常的 yaml 直接值,对于复杂键,使用?做键标识。
语法
与 json 类似,yaml 的库函数大致有两类;load 和 dump,对应了 parse 和 stringfy。
XML
xml 是一种广泛使用的,类似于 HTML 的标记语言,比起前两个,可表达的信息更多,很多数据内部都是使用 xml +压缩包实现的。
xml 的设计更接近 html-like 的 json,他们都在传输内容中有较大作用,而 yaml 更加偏向于本地标记语言。
特点:
- xml 没有规定任何标签,大部分是约定俗成的
- xml 的元素名中间不能使用空格,也不能以 xml 三字母开头的非保留字
- 严格区分大小写(其实三者都一样)
- 标签是层级结构,不能互相嵌合。
语法
标签语法:与 HTML 高度一致
标签名 <name></name>
自闭合标签: <name/>
注释:<!-- info –>
属性: 与 HTML 保持一致:<name 属性=“值” 属性2=“值”>……
CDATA:转义符,处理一些被语法占用的符号
XML 约束
约束相当于一个编写文档,对 xml 的格式提出要求。
DTD 约束
一种类似关键字+正则的匹配规定策略。
Schema约束
DTD 的升级版本,语法更加贴近 xml 本身,但是语法规则复杂,这里不特意展开,还是给 AI 来写吧(
语法
xml 使用的函数也有 parse 和 stringfy 的类似方法,但是语言之间的实现差异较大,所以仅仅提及。
总结
这几种语言在学习时经常出现,也不断要写,但是每次都是有样学样,没有掌握的说法,所以这里专门整理出来,以供快速查验,也便于使用更多高级语法来简化工作。
三种数据结构各有异同,比如 json,yaml 比较轻量但是表达比较有限而且不好看,xml 虽然很重但是拓展功能很多,相对容易读。xml 和 yaml 都引入了解释器和动态语法,而 json 相对比较简单,只是一种数据表示格式,也表示传输性质好。实际使用的时候要根据需求灵活选择使用
三种语法都是进行对象储存的方式,还有诸如 csv 等结构化的储存方式。但是相对而言标准比较同意,格式比较明显,所以不多介绍。