gookit/properties - Java Properties 格式內容的解析器,編碼解碼庫
- 通用的Java
properties
格式內容解析器 - 支援像
json
包一樣的Marshal
和Unmarshal
- 支援以
!
,#
開頭的行註釋- 增強: 也額外支援
//
,/* multi line comments */
- 增強: 也額外支援
- 支援多行字串值,以
\\
結尾進行換行- 增強: 也額外支援
'''multi line string''''
,"""multi line string"""
- 增強: 也額外支援
- 支援值引用 var 解析。 format:
${some.other.key}
- 支援 ENV 變數解析。 format:
${APP_ENV}
,${APP_ENV | default}
Github: github.com/gookit/properties
安裝
go get github.com/gookit/properties
使用
properties
格式內容示例:
name = inhere
age = 345
only-key =
env-key = ${SHELL | bash}
##### comments1
top.sub.key0 = a string value
top.sub.key1 = "a quote value1"
top.sub.key2 = 'a quote value2'
/* comments 1.1 */
top.sub.key3 = 234
! inline list
top2.inline.list.ids = [234, 345, 456]
# use var refer
top2.sub.var-refer = ${top.sub.key0}
/*
multi line
comments
*/
top2.sub.key2-other = has-char
# comments 2
top.sub.key3 = false
# slice list
top.sub.key4[0] = abc
top.sub.key4[1] = def
## --- comments 3 ---
top.sub.key5[0].f1 = ab
top.sub.key5[1].f2 = de
# multi line value
top.sub2.mline1 = """multi line
value
"""
# multi line value2
top.sub2.mline2 = this is \
multi line2 \
value
解析內容
p := properties.NewParser(
properties.ParseEnv,
properties.ParseInlineSlice,
)
p.Parse(text)
fmt.Println("\ndata map:")
dump.NoLoc(p.Data)
Output:
maputil.Data { #len=6
"name": string("inhere"), #len=6
"age": string("345"), #len=3
"only-key": string(""), #len=0
"env-key": string("/bin/zsh"), #len=8
"top": map[string]interface {} { #len=2
"sub": map[string]interface {} { #len=6
"key5": []map[string]interface {} [ #len=2
map[string]interface {} { #len=1
"f1": string("ab"), #len=2
},
map[string]interface {} { #len=1
"f2": string("de"), #len=2
},
],
"key0": string("a string value"), #len=14
"key1": string("a quote value1"), #len=14
"key2": string("a quote value2"), #len=14
"key3": string("false"), #len=5
"key4": []string [ #len=2
string("abc"), #len=3
string("def"), #len=3
],
},
"sub2": map[string]interface {} { #len=2
"mline2": string("this is multi line2 value"), #len=25
"mline1": string("multi line
value
"), #len=17
},
},
"top2": map[string]interface {} { #len=2
"sub": map[string]interface {} { #len=2
"var-refer": string("a string value"), #len=14
"key2-other": string("has-char"), #len=8
},
"inline": map[string]interface {} { #len=1
"list": map[string]interface {} { #len=1
"ids": []string [ #len=3
string("234"), #len=3
string("345"), #len=3
string("456"), #len=3
],
},
},
},
},
解析並繫結到結構體
package main
import (
"fmt"
"github.com/gookit/properties"
)
func Example() {
text := `
# properties string
name = inhere
age = 200
`
p, err := properties.Parse(text)
if err != nil {
panic(err)
}
type MyConf struct {
Name string `properties:"name"`
Age int `properties:"age"`
}
cfg := &MyConf{}
err = p.MapStruct("", cfg)
if err != nil {
panic(err)
}
fmt.Println(*cfg)
// Output:
// {inhere 200}
}
編碼解碼
Marshal(v interface{}) ([]byte, error)
Unmarshal(v []byte, ptr interface{}) error
示例: 解碼:
cfg := &MyConf{}
err := properties.Unmarshal([]byte(text), cfg)
if err != nil {
panic(err)
}
fmt.Println(*cfg)
示例: 編碼
data := map[string]any{
"name": "inhere",
"age": 234,
"str1": "a string",
"str2": "a multi \nline string",
"top": map[string]any{
"sub0": "val0",
"sub1": []string{"val1-0", "val1-1"},
},
}
bs, err = properties.Marshal(data)
if err != nil {
panic(err)
}
fmt.Println(string(bs))
輸出:
str1=a string
str2=a multi \
line string
top.sub1[0]=val1-0
top.sub1[1]=val1-1
top.sub0=val0
name=inhere
age=234
配置管理
如果您想要同時支援多種檔案格式和多檔案載入,建議使用 gookit/config
- 支援多種格式:
JSON
(預設)、INI
、Properties
、YAML
、TOML
、HCL
- 支援多檔案載入,會自動合併載入的資料
Github: github.com/gookit/properties
本作品採用《CC 協議》,轉載必須註明作者和本文連結
GIthub github.com/inhere