hocon配置文件快速入门
HOCON,全称为:Human-Optimized Config Object Notation),翻译为汉语为:人性化配置对象表示法,是一种人类易于阅读的数据格式。是JSON和properties的一个超集,也就是说完全兼容JSON和properties格式的文件。HOCON 文件通常以 .conf 作为后缀名。本文将详细介绍 hocon 语法的各个方面包括基本语法、注释、数据类型、引用、包含等内容。
一、基本语法
这部分的大量内容都一定程度上借用了 JSON 的相关概念;
组成部分
- 一个 key 是一个键值对字符串中的前一个值
- 一个 value 可以是字符串、数字、对象、数组或者布尔值并紧随 key 的后面
- 一个 key-value separator 把键和值分离,可以是 : 或者 =
- 一个 comment 以 # 或者 // 开头,通常用于提供反馈或说明
对根结构更宽松的要求
JSON 格式要求根结构必须为数组或者对象。空文件不合法,只含有字符串等既不是数组也不是对象的元素的文件,也不合法。
HOCON 文件如果不以方括号或花括号开头,那么它将以被 {} 包围的方式解析。
一个省略了开头 { 却没有省略结尾 } 的 HOCON 文件不合法;HOCON 格式要求括号必须匹配。
键值分隔符
字符 = 可以被用在所有 JSON 要求使用 : 的场合,例如:用于分隔键值。
如果一个键随后的字符为 {,那么中间的 = 可以省略。也就是说,"foo" {} 和 "foo" : {} 是一样的。
hocon 配置文件使用键值对的形式来表示配置项,每个键值对之间使用冒号进行分隔。例如 :
key: value
hocon 语法中的键可以使用点号进行嵌套,表示配置项的层级关系例如:
parent.child: value
如果一个键同时也是一个包含有多个元素的路径表达式,那么在解析时除最后一个元素外的所有元素都将被展开成对象。路径的最后一个元素与值结合,从而最后形成嵌套对象中的一个键值对。
换言之:
foo.bar : 42
和:
foo { bar : 42 }
是等价的。以及:
foo.bar.baz : 42
和:
foo { bar { baz : 42 } }
也是等价的。对象的值会进行合并;也就是说:
a.x : 42, a.y : 43
和:
a { x : 42, y : 43 }
是等价的。因为路径表达式和值连结类似,所以说你可以在键值对的键中使用空格,比如说:
a b c : 42
和:
"a b c" : 42
是等价的。
多行字符串
和 Python 以及 Scala 等语言类似,多行字符串使用三个引号。如果在解析时解析到了 """ 三个字符的序列,那么在下一个用作闭合字符序列的 """ 出现之前,其中所有 Unicode 字符都将被不加修改地用作字符串值的组成部分。不管是空格还是换行符,都不作特殊处理。和 Scala 的处理方式,以及 JSON 对待被引号括起来的字符串的处理方式不同,转义符在被三个引号括起来的字符串中不作处理。
在 Python 中,诸如 """foo"""" 的形式会导致语法错误(三个引号的字符串序列后紧跟着一个悬空引号)。在 Scala 中,这种形式将被看作由四个字符组成的字符串 foo"。HOCON 的解析方式和 Scala 类似;序列中的最后三个引号被看作多行字符串的闭合字符序列,而所有“多出来的”引号将被看作多行字符串的一部分。
二、注释
hocon 语法支持单行注释和多行注释。单行注释以 // 或 # 开头。例如:
#这是一个单行注释
//这是另外一个单行注释
三、数据类型
hocon 语法支持多种数据类型,包括字符串、数值、布尔值、数组和对象。
1.字符
字符串使用双引号括起来,例如:
key: "value"
等价于
key="value"
2.值
数值可以是整数或浮点数,例如:
key: 100
key: 3.14
等价于
key=100
key=3.14
3.布尔值
布尔值可以是true 或false,例如 :
key: true
key: false
4.数组
数组使用方括号括起来,元素之间使用逗号进行分隔,例如:
key: [1, 2, 3]
等价于
key=[1,2,3]
5.对象
对象使用花括号括起来,键值对之间使用冒号进行分隔,例如
key: {
child1: value1
child2: value2
}
等价于
key.child1:value1
key.child2:value2
四、键值分隔符+=
除了 : 和 =,键与值之间还可以用 += 分割。使用 += 分隔的键值对会令值变为自引用数组,例如:
a += b
会变成:
a = ${?a} [b]
+= 起到了在数组结尾追加元素的作用。
虽然hocon支持键值分隔符+=,但是本人认为,还是尽量不使用的好。
五、引用
hocon 语法支持引用其他配置项的值。使用{}将要引用的配置项包裹起来,并在引用的配置项名前加上$符号。例如:
key1: valuel
key2: $(key1}
等价于
key1=valuel
key2=$(key1}
引用可以嵌套使用,例如:
keyl: valuel
key2: $(key1)
key3: $(key2)
等价于
keyl= valuel
key2=$(key1)
key3=$(key2)
六、包含
hocon 语法支持在配置文件中包含其他配置文件。使用 include 关键字,并在后面跟上要包含的文件路径,这一点和标准的C语言的include含义差不多。例如:
include "path/to/file.conf"
默认情况下,如果文件引用者试图引用一个不存在的文件,那么该引用本身应该被静默忽略。但如果被引用文件本身被强制要求存在,同时跨文件引用声明使用了 required(),那么在解析不存在的被引用文件时应该报错。例如:
include required("foo.conf")
include required(file("foo.conf"))
include required(classpath("foo.conf"))
include required(url("http://localhost/foo.conf"))
七、总结
hocon完全兼容json和properties,是他们的超集,可以写注释,也可以使用变量和引用,还可以继承和自动类型转换等。hocon 语法是一种灵活且易于使用的配置文件语法,能够满足各种配置需求。通过合理使用 hocon 语法,我们可以轻松地管理和配置各种应用程序的参数和设置,特别是在大中型项目中优势非常明显。