golang彩色JSON格式化输出插件库jsoncolor的使用
golang彩色JSON格式化输出插件库jsoncolor的使用
neilotoole/jsoncolor
是一个直接替代标准库 encoding/json
的包,可以输出彩色化的JSON格式。
为什么需要这个库?
jq
工具默认会彩色化输出,而彩色输出对于很多Go CLI工具来说是非常有用的。这个包在编码器中内联实现了彩色化和缩进功能,在缩进处理上比标准库更快。
安装
使用常规方式安装(需要Go 1.16+):
go get -u github.com/neilotoole/jsoncolor
使用示例
package main
import (
"fmt"
"github.com/mattn/go-colorable"
json "github.com/neilotoole/jsoncolor"
"os"
)
func main() {
var enc *json.Encoder
// 注意:在Goland等IDE中运行时,IsColorTerminal可能会返回false
if json.IsColorTerminal(os.Stdout) {
// 可以使用彩色输出
out := colorable.NewColorable(os.Stdout) // Windows需要这个
enc = json.NewEncoder(out)
// DefaultColors类似于jq的默认配色
clrs := json.DefaultColors()
// 修改一些值,只是为了演示
clrs.Bool = json.Color("\x1b[36m") // 修改布尔值颜色
clrs.String = json.Color{} // 禁用字符串颜色
enc.SetColors(clrs)
} else {
// 不能使用彩色,但编码器仍然可以工作
enc = json.NewEncoder(os.Stdout)
}
m := map[string]interface{}{
"a": 1,
"b": true,
"c": "hello",
}
if err := enc.Encode(m); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
配置
要启用彩色化,调用 enc.SetColors
方法。
Colors
结构体保存颜色配置。零值和 nil
都是安全的(会导致没有彩色化)。
DefaultColors
函数返回一个 Colors
结构体,产生类似于 jq
的结果:
// DefaultColors返回默认的颜色配置
// 这些颜色基本遵循jq的默认彩色化,有一些差异
func DefaultColors() *Colors {
return &Colors{
Null: Color("\x1b[2m"),
Bool: Color("\x1b[1m"),
Number: Color("\x1b[36m"),
String: Color("\x1b[32m"),
Key: Color("\x1b[34;1m"),
Bytes: Color("\x1b[2m"),
Time: Color("\x1b[32;2m"),
Punc: Color{}, // 无彩色化
}
}
如上所示,使用 Color
零值(Color{}
)可以禁用该JSON元素的彩色化。
与fatih/color的辅助集成
直接使用终端代码如 json.Color("\x1b[36m")
可能不太方便。有一个辅助包提供了与 fatih/color
的适配器。
// import "github.com/neilotoole/jsoncolor/helper/fatihcolor"
// import "github.com/fatih/color"
// import "github.com/mattn/go-colorable"
out := colorable.NewColorable(os.Stdout) // Windows需要这个
enc = json.NewEncoder(out)
fclrs := fatihcolor.DefaultColors()
// 修改一些值,只是为了演示
fclrs.Number = color.New(color.FgBlue)
fclrs.String = color.New(color.FgCyan)
clrs := fatihcolor.ToCoreColors(fclrs)
enc.SetColors(clrs)
完全替代encoding/json
这个包完全替代了标准库 encoding/json
(感谢祖先包 segmentio/encoding/json
是完全替代的)。
要替换使用,只需使用导入别名:
import json "github.com/neilotoole/jsoncolor"
示例应用:jc
查看 cmd/jc
目录,有一个简单的CLI实现,可以接受JSON输入并以彩色输出JSON。
# 从项目根目录
$ go install ./cmd/jc
$ cat ./testdata/sakila_actor.json | jc
性能
这个包包含基准测试,比较了与其他JSON编码器包的编码性能。结果显示:
segmentj
在所有编码任务上都比stdlib
表现更好jsoncolor
在缩进方面比segmentj
表现更好(这是合理的,因为缩进是内联执行的)jsoncolor
在所有编码任务上都比stdlib
表现更好
注意事项
- 这个包的编码器(至少从
v0.1.14
开始)将time.Duration
编码为字符串,而stdlib
输出为int64
。这个包遵循stdlib
。 Colors.Punc
字段控制所有标点符号的彩色化,即[]{},:"
。
更多关于golang彩色JSON格式化输出插件库jsoncolor的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang彩色JSON格式化输出插件库jsoncolor的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang彩色JSON格式化输出插件库jsoncolor使用指南
jsoncolor
是一个用于Golang的轻量级库,它可以将JSON数据以彩色格式输出到终端,提高可读性。下面详细介绍其使用方法。
安装
go get github.com/neilotoole/jsoncolor
基本用法
简单示例
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/neilotoole/jsoncolor"
)
func main() {
data := map[string]interface{}{
"name": "John Doe",
"age": 30,
"active": true,
"address": map[string]string{
"street": "123 Main St",
"city": "New York",
},
"tags": []string{"developer", "golang"},
}
// 创建彩色编码器
enc := jsoncolor.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
// 编码并输出彩色JSON
if err := enc.Encode(data); err != nil {
fmt.Println("Error:", err)
}
}
自定义颜色
jsoncolor
允许自定义不同JSON元素的颜色:
func main() {
data := map[string]interface{}{
"project": "jsoncolor demo",
"version": 1.0,
}
// 创建自定义颜色配置
colors := jsoncolor.DefaultColors()
colors.String = jsoncolor.Color{Foreground: jsoncolor.Green}
colors.Number = jsoncolor.Color{Foreground: jsoncolor.Yellow}
colors.Bool = jsoncolor.Color{Foreground: jsoncolor.Magenta}
// 创建编码器并应用自定义颜色
enc := jsoncolor.NewEncoder(os.Stdout)
enc.SetColors(colors)
enc.SetIndent("", " ")
if err := enc.Encode(data); err != nil {
fmt.Println("Error:", err)
}
}
从JSON字符串格式化
func main() {
jsonStr := `{
"id": 12345,
"name": "Product A",
"price": 29.99,
"inStock": true,
"features": ["fast", "reliable", "easy"]
}`
var data interface{}
if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
fmt.Println("Error:", err)
return
}
enc := jsoncolor.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
enc.Encode(data)
}
高级功能
禁用颜色输出
enc := jsoncolor.NewEncoder(os.Stdout)
enc.SetColors(nil) // 禁用颜色
自定义缩进
enc := jsoncolor.NewEncoder(os.Stdout)
enc.SetIndent(">>>", "\t") // 使用自定义缩进
直接处理JSON字节
jsonBytes := []byte(`{"name":"Alice","age":25}`)
formatted, err := jsoncolor.Colorize(jsonBytes, nil)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println(string(formatted))
}
颜色配置选项
jsoncolor.Color
结构体支持以下配置:
type Color struct {
Foreground ColorType // 前景色
Background ColorType // 背景色
Bold bool // 是否加粗
Italic bool // 是否斜体
Underline bool // 是否下划线
}
预定义的颜色常量包括:
Black
Red
Green
Yellow
Blue
Magenta
Cyan
White
BrightBlack
(灰色)BrightRed
BrightGreen
BrightYellow
BrightBlue
BrightMagenta
BrightCyan
BrightWhite
注意事项
- 颜色输出只在支持ANSI颜色的终端中有效
- 在Windows上可能需要额外配置才能显示颜色
- 对于生产环境日志,建议添加颜色检测逻辑
jsoncolor
是一个简单但强大的工具,特别适合开发调试时提高JSON数据的可读性。