Simple Hocon Configuration Library
轻量 Hocon 配置库
这是一个轻量级的 Hocon 配置库,没有其他依赖项。 注意,这是一个使用 Hocon 格式的配置库,而不是完整的 Hocon 解析库。
该配置库除了使用结点 -- Node 手动获取配置外,还可以使用 @Setting 注解字段,以自动获取配置。
使用 NodeMap 的 void modify(Object target); 方法,可以用结点的值修改目标对象对应名称用 @Setting 注解的字段。
使用 NodeMap 的 void extract(Object source); 方法,可以提取源对象对应名称用 @Setting 注解的字段的值到结点。
另外该库支持对注释内容的翻译,可通过设置翻译器实现本地化效果。
<dependency>
<groupId>org.soraworld</groupId>
<artifactId>hocon</artifactId>
<version>1.2.3-SNAPSHOT</version>
<type>pom</type>
</dependency>compile 'org.soraworld:hocon:1.2.3-SNAPSHOT'repositories {
maven {
url 'https://maven.pkg.github.com/himmelt/hocon'
credentials {
username ='Your Github Username'
password =System.getenv("PACKAGES_TOKEN")//Your personal access token (classic)
}
}
}根结点即文件所对应的结点, 根结点必定是一个 NodeMap 结点.
根结点下存储 key<->value 键值对, 其中 value 值可以是
基础结点(NodeBase), 列表结点(NodeList), 映射结点(NodeMap)
键 和 值 之间用 = 连接, 如果字符串含有空格或其他特殊字符,
则需要在字符串两端加双引号 "
详细特殊字符的正则表达为 `.*[":=,+?`!@#$^&*{}\[\]\\].*
# 井号开头的行全部认为是注释key1 = abckey2 = "字符串值2"key3 = 123.456key4 = false# 值的内容代表 空 nullkeyNull = null# 值的内容代表字符串 "null"stringNull = "null"键 和 值 之间用 = 连接, 如果列表为空, 直接接 关闭的方括号 [],
如过列表不为空, 接 左方括号 [ , 新行填列表元素, 每个元素都新起一行.
元素结束, 新行 接 右方括号 ].
缩进只是为了美观, 元素可以不用缩进, 顶行写也是可以的.
# 字符串列表stringlist = [
"字符串列表元素1"字符串列表元素2"string elemnet 3"HelloWorld
]
# 整数列表intlist = [
1357
]
# 空列表emptylist = []
# (整数)列表列表listlist = [
[
124
]
[
689
]
]
# 映射列表(其存储的元素是 映射)maplist = [
# 第一个映射
{
key1 = abckey2 = 123
}
# 第二个映射#缩进只是为了美观, 元素可以不用缩进, 顶行写也是可以的.
{
key1 = falsehello = "Hello World"
}
]键 和 值 之间没有内容, 如果映射为空, 直接接 关闭的花括号 {},
键 只能为字符串, 如果键含有特殊字符 则要加双引号 ",
如过映射不为空, 接 左花括号 { , 新行填 映射键值对, 每个键值对都新起一行.
元素结束, 新行 接 右花括号 }.
缩进只是为了美观, 元素可以不用缩进, 顶行写也是可以的.
# 整数映射int_map {
key1 = 233ke2 = 456xxx = 5749850394
}
# 空映射# 键名可以为中文(常规使用时不建议)空映射 {}
# 特殊字符的键要加 引号 """!himmelt&shiki" {
# 这样也是空映射
}
# 嵌套映射, 和 yaml/json 等 的层级关系一样父结点 {
键1 = 值1子基础结点 = 值2空列表1 = []
列表2 = [
134
]
子列表结点 = [
{
键1 = 值1
键2 = 值2空列表1 = []
}
{
键11 = 值11
键22 = 值22空列表11 = []
}
]
子映射结点 {
孙子键1 = "孙子值1"孙子映射结点 {
重孙子键 = 1234567
}
}
}publicclassTest{
@Setting(comment = "comment.lang")
protectedStringlang = "zh_cn";
@Setting(comment = "comment.debug")
protectedbooleandebug = false;
protectedfinalPathconfile;
protectedfinalOptionsoptions = Options.build();
publicManager(Pathpath) {
this.path = path;
this.options.setTranslator(this::trans);
this.options.registerType(newLocationSerializer());
this.confile = path.resolve(plugin.getId().replace(' ', '_') + ".conf");
}
publicbooleanload() {
try {
FileNoderootNode = newFileNode(confile.toFile(), options);
rootNode.load(true);
rootNode.modify(this);
options.setDebug(debug);
returntrue;
} catch (Throwablee) {
returnfalse;
}
}
}