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"])
}

注意事项

  1. HJSON 解析后与标准 JSON 数据结构兼容
  2. 对于需要严格 JSON 格式的场景,可以使用 hjson.Unmarshal 解析后再用 json.Marshal 转换为标准 JSON
  3. HJSON 保留了 JSON 的所有数据类型,只是语法更宽松
  4. 在团队协作中,如果所有人都接受 HJSON 格式,它可以提高配置文件的可读性

总结

HJSON 为配置文件提供了更人性化的语法,特别适合需要频繁手动编辑的配置文件场景。Go 的 hjson-go 库提供了简单易用的 API 来解析和生成这种格式。

回到顶部