项目地址:https://github.com/lightbend/config
api地址:https://lightbend.github.io/config/latest/api/
文档中文翻译版:https://github.com/ustc-zzzz/HOCON-CN-Translation/blob/master/HOCON.md
官方包:// https://mvnrepository.com/artifact/com.typesafe/config
implementation group: ‘com.typesafe’, name: ‘config’, version: ‘1.4.0’
官方包:我们可以直接把配置文件默认加载,也可以根据文件名加载
默认文件名为:application.config …按特定文件名加载顺序进行加载
第三方包:可以抽离出来对象扩展了功能可以实现kotlin对象和config之间的对象转换
group:‘io.github.config4k’,name:‘config4k’,version:‘0.4.2’
使用hocon的优点
1.语法简单、灵活
2.允许从变量中取值,允许写注释,解决了json的痛点
3.相比json更低的信噪比,json有很多的多余字符 很无用
4.能够比较方便的覆盖参数值(方便书写或者debug)ps:可以在运行的时候直接通过参数修改配置参数的值,而不用跑过去修改配置文件。
5.支持多行字符串,json不支持多行字符串
6.在配置文件中支持一处引用另一处
使用hocon的缺点
比json难描述,也比json难解析
hocon中和json一样的地方
文件必须是合法的 UTF-8 格式
加引号的字符串格式和 JSON 中的字符串相同
值类型可以是:字符串、数值、对象、数组、布尔值、以及空(null)
允许的数字格式和 JSON 相同;在 JSON 中一些可能的浮点数值,如 NaN 等,是不允许出现的
注释的两种方式 // 和#
##第一种注释方式
//第二种注释方式
连接方式灵活
比如说“foo" {}和“foo":{
}是一样的 或着直接不加连接好 则按照{
}解析
foo {
}
元素划分
使用逗号、/n或着换行符,代表元素的划分,否则可能自连接为一个元素
在第一个值前或最后一个值后的空白将会被忽略。只有值 之间 的空白会被保留。
[1,2,3,4]四个元素
[1 2 3 4]一个元素 "1 2 3 4"
重复键的值合并问题
对于简单值,相同键的后出现的覆盖前面先出现的
a:32
a:42
解析的时候 a为42
对于对象,会自动合并在一起
{
foo : {
a:42},
foo : {
b:43}
}
等价于
{
foo:{
a:42,b:43}
}
对象合并的过程中如果遇到null则会停止合并,然后进行覆盖
{
foo : {
a:42},0
foo : null,
foo:{
b:43}
}
最终的结果:
{
foo:{
b:43}
}
关键字的解析问题
不加引号的非关键字都会被直接解析为字符串
truefoo 会被解析成 true 和一个字符串"foo"
footrue 会被解析成一个字符串"footrue"
多行字符串解析:
三对引号中间的所有字符都会被当作字符串处理,类似于scala,比如
"""foo""""将会被解析成foo".
也就是说三对引号之间的内容都会被解析成字符串 无论是否是特殊符号
值连结
对象中键值对的键或着值或着数组元素或者对象好可能表现为多个合在一起的值的组合,有三种连结方式
1.简单值的组合为字符串(关键字在里面也会被直接当成字符串 )
2.数组的组合为单个数组
3.对象的组合为合并后的单个对象
注意不同类型的数据之间不能进行值连接,否则会报错
“合并为字符串”
"合并为数组"
“合并对象”
对象的值连接蕾丝于继承 ,不仅可以获取变量的值,还可以对其进行修改
human:{
name:测试,sex:男,add="中国"}
//覆盖里面的add
person:${
human}{
add="测试地址"}
//扩充里面的属性
data-center-generic = {
cluster-size = 6 }
data-center-east = ${
data-center-generic} {
name = "east" }
多样的路径表达方式
a: {
b: {
c: 3
d: 4
}
}
上路路径方式和下面是等级iAd额
a.b.c = 3
a.b.d = 4
a b c = 42 和“a b c"=42是等价的
因为路径表达式总是被转换成字符串,因此即使是拥有其他类型含义的单个值,
也会被转换成字符串类型。
true:42 等价于 “true" : 42
3:42 等价于 “3”:42
3.14:42 和“3” :{
"14":42}等价
引用
${
变量名} 常规引用的使用方式
animal.favorite : cat
key : ${
animal.favorite} is my favorite animal
eq key :${
animal.favorite}"is my favorite animal"
对于 foo : ${
?bar} 来说,在 bar 未定义时,foo 这个键不会存在。对于 foo : ${
?bar}${
?baz} 来说,
如果 bar 和 baz 都 没有定义,那么 foo 这个键不会存在 ,自动忽略这个键
自引用:自己引用自己变量的值,然后对其进行更新覆盖
自引用事例:
a:${
a}
a:${
a}bc
path