hocon配置文件快速入门

liftword1周前 (05-15)技术文章5

#首发创作赛#

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 语法,我们可以轻松地管理和配置各种应用程序的参数和设置,特别是在大中型项目中优势非常明显。

相关文章

进阶版Python正则表达式大全,看到就赚到了

正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能...

简单学Python——re库(正则表达式)3(元字符“.”)

前面我们学习了search()、match()、findall()等方法搜索字符。虽然可以查找字符,但目前能实现的功能较弱,仅能在完全匹配的情况下查找出来,没有模糊查询。今天我们学习“元字符”来实现模...

Python JSON处理黑魔法:demjson库的隐藏技巧大公开

对话实录小白:(抓狂)这个 JSON 里有注释和单引号,标准库解析不了!专家:(掏出魔杖)用 demjson库,专治各种不规范 JSON!专家解释为什么使用demjson?demjson的一些优点:它...

使用Python Shells绕过杀毒软件

一、绕过杀毒软件Why?1、使用绕过反病毒软件的方式要比禁用杀毒软件更加安全;2、展示客户端的反病毒软件是多么脆弱的非常有趣。How?如果你使用二进制,而这个二进制文件被You can bypass...

python每天一道面试题25

Python中正则表达式常用法?正则表达式一般两个用途一是:检测某一段字符串是否符合规则,也就是我们常说的“校验”;二是:从一大段字符串中找到符合规则的字符串,可以理解为“检索”。正则表达式模块正则表...

《shell》算术表达式-test测试语句-if流程语句

在上一章入门篇中我们介绍了shell的基本语法,shell是什么和shell变量的使用,今天我们接着说一下基础篇部分的其他一点内容,主要包含read命令,算术表达式,test测试语句,if流程控制语句...