golang人性化JSON配置解析插件库hjson的使用
Golang 人性化 JSON 配置解析插件库 hjson 的使用
Hjson 是一种人性化的 JSON 格式,它允许注释、省略引号和逗号,使配置文件更易于阅读和编写。
Hjson 示例
{
# 指定速率(单位:请求/秒)(因为注释很有帮助!)
rate: 1000
// 更喜欢 C 风格注释?
/* 感觉老派? */
# 你注意到 rate 不需要引号了吗?
hey: look ma, no quotes for strings either!
# 最棒的是
notice: []
anything: ?
# 是的,逗号是可选的!
}
安装
要在 Go 项目中使用 Hjson,首先添加导入:
import "github.com/hjson/hjson-go/v4"
然后运行 go mod tidy
下载依赖。
如果要安装命令行工具:
go install github.com/hjson/hjson-go/v4/hjson-cli@latest
作为 Go 库使用
基本用法
package main
import (
"github.com/hjson/hjson-go/v4"
"fmt"
)
func main() {
// 解码 Hjson 数据到 Go 值
sampleText := []byte(`
{
# 指定速率(单位:请求/秒)
rate: 1000
array:
[
foo
bar
]
}`)
// 提供变量用于存储解码数据
var dat map[string]interface{}
// 使用默认选项解码并检查错误
if err := hjson.Unmarshal(sampleText, &dat); err != nil {
panic(err)
}
fmt.Println(dat)
// 使用解码后的值需要类型断言
rate := dat["rate"].(float64)
fmt.Println(rate)
array := dat["array"].([]interface{})
str1 := array[0].(string)
fmt.Println(str1)
// 编码为 Hjson
sampleMap := map[string]int{"apple": 5, "lettuce": 7}
hjson, _ := hjson.Marshal(sampleMap)
fmt.Println(string(hjson))
}
解码到 Go 结构体
package main
import (
"github.com/hjson/hjson-go/v4"
"fmt"
)
type Sample struct {
Rate int
Array []string
}
type SampleAlias struct {
Rett int `json:"rate"`
Ashtray []string `json:"array"`
}
func main() {
sampleText := []byte(`
{
# 指定速率(单位:请求/秒)
rate: 1000
array:
[
foo
bar
]
}`)
// 解码到结构体
var sample Sample
hjson.Unmarshal(sampleText, &sample)
fmt.Println(sample.Rate)
fmt.Println(sample.Array)
// 使用 json 标签解码
var sampleAlias SampleAlias
hjson.Unmarshal(sampleText, &sampleAlias)
fmt.Println(sampleAlias.Rett)
fmt.Println(sampleAlias.Ashtray)
}
结构体字段注释
package main
import (
"github.com/hjson/hjson-go/v4"
"fmt"
)
type foo struct {
A string `json:"x" comment:"第一条注释"`
B int32 `comment:"第二条注释\n看,换行"`
C string
D int32
}
func main() {
a := foo{A: "hi!", B: 3, C: "some text", D: 5}
buf, err := hjson.Marshal(a)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(buf))
}
输出:
{
# 第一条注释
x: hi!
# 第二条注释
# 看,换行
B: 3
C: some text
D: 5
}
读取和写入注释
package main
import (
"fmt"
"github.com/hjson/hjson-go/v4"
)
func main() {
// 解码 Hjson 数据到 hjson.Node
sampleText := []byte(`
{
# 指定速率(单位:请求/秒)
rate: 1000
array:
[
foo
bar
]
}`)
var node hjson.Node
if err := hjson.Unmarshal(sampleText, &node); err != nil {
panic(err)
}
node.NK("array").Cm.Before = ` # 请指定一个数组
`
if _, _, err := node.NKC("subMap").SetKey("subVal", 1); err != nil {
panic(err)
}
outBytes, err := hjson.Marshal(node)
if err != nil {
panic(err)
}
fmt.Println(string(outBytes))
}
命令行工具使用
# 将 JSON 转换为 Hjson
hjson-cli test.json > test.hjson
# 将 Hjson 转换为 JSON
hjson-cli -j test.hjson > test.json
命令行选项:
usage: hjson-cli [OPTIONS] [INPUT]
hjson 可用于在 JSON 和 Hjson 之间转换。
如果没有指定输入文件,将从标准输入读取。
选项:
-bracesSameLine
将大括号放在同一行
-c 输出为 JSON
-h 显示帮助
-indentBy string
缩进字符串(默认为 " ")
-j 输出为格式化 JSON
-omitRootBraces
省略根级别的大括号
-preserveKeyOrder
保持对象/映射中的键顺序
-quoteAlways
总是引用字符串值
-v
显示版本
Hjson 是一个强大的工具,可以使配置文件更易于阅读和维护,同时保持与标准 JSON 的兼容性。
更多关于golang人性化JSON配置解析插件库hjson的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang人性化JSON配置解析插件库hjson的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang HJSON 配置解析库使用指南
HJSON 是一种人性化的 JSON 格式,它允许注释、省略引号、多行字符串等特性,使得配置文件更易读易写。在 Go 中,我们可以使用 hjson
库来解析这种格式。
安装 hjson 库
go get github.com/hjson/hjson-go/v4
基本使用方法
1. 解析 HJSON 文件
假设我们有一个 config.hjson
文件:
{
# 服务器配置
server: {
host: "localhost" // 主机地址
port: 8080
}
database: {
# 数据库连接
url: "postgres://user:pass@localhost/db"
pool: 10
}
features: [
"search"
"export"
"stats"
]
}
解析代码:
package main
import (
"fmt"
"os"
"github.com/hjson/hjson-go/v4"
)
type Config struct {
Server ServerConfig
Database DatabaseConfig
Features []string
}
type ServerConfig struct {
Host string
Port int
}
type DatabaseConfig struct {
URL string
Pool int
}
func main() {
// 读取文件内容
data, err := os.ReadFile("config.hjson")
if err != nil {
panic(err)
}
// 解析到结构体
var config Config
if err := hjson.Unmarshal(data, &config); err != nil {
panic(err)
}
fmt.Printf("Server: %s:%d\n", config.Server.Host, config.Server.Port)
fmt.Printf("Database: %s (pool: %d)\n", config.Database.URL, config.Database.Pool)
fmt.Printf("Features: %v\n", config.Features)
}
2. 生成 HJSON 文件
func writeHJSON() {
config := Config{
Server: ServerConfig{
Host: "127.0.0.1",
Port: 3000,
},
Database: DatabaseConfig{
URL: "mysql://user:pass@localhost/db",
Pool: 5,
},
Features: []string{"auth", "logging", "metrics"},
}
// 转换为 HJSON 格式
data, err := hjson.Marshal(config)
if err != nil {
panic(err)
}
// 写入文件
if err := os.WriteFile("output.hjson", data, 0644); err != nil {
panic(err)
}
fmt.Println("Config written to output.hjson")
}
3. HJSON 特性示例
HJSON 支持许多人性化特性:
{
// 可以省略引号
unquoted: 你好世界
// 多行字符串
multiline: '''
第一行
第二行
第三行
'''
# 允许注释
"quoted": "value" # 行尾注释
// 省略逗号
numbers: [1 2 3 4]
// 尾随逗号
trailing: [
"item1",
"item2",
]
}
解析代码:
func parseSpecialFeatures() {
data := []byte(`
{
unquoted: 你好世界
multiline: '''
第一行
第二行
第三行
'''
"quoted": "value" # 行尾注释
numbers: [1 2 3 4]
trailing: [
"item1",
"item2",
]
}
`)
var result map[string]interface{}
if err := hjson.Unmarshal(data, &result); err != nil {
panic(err)
}
fmt.Println("Unquoted:", result["unquoted"])
fmt.Println("Multiline:", result["multiline"])
fmt.Println("Numbers:", result["numbers"])
fmt.Println("Trailing:", result["trailing"])
}
注意事项
- HJSON 解析后与标准 JSON 数据结构兼容
- 对于需要严格 JSON 格式的场景,可以使用
hjson.Unmarshal
解析后再用json.Marshal
转换为标准 JSON - HJSON 保留了 JSON 的所有数据类型,只是语法更宽松
- 在团队协作中,如果所有人都接受 HJSON 格式,它可以提高配置文件的可读性
总结
HJSON 为配置文件提供了更人性化的语法,特别适合需要频繁手动编辑的配置文件场景。Go 的 hjson-go
库提供了简单易用的 API 来解析和生成这种格式。