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

1 回复

更多关于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

注意事项

  1. 颜色输出只在支持ANSI颜色的终端中有效
  2. 在Windows上可能需要额外配置才能显示颜色
  3. 对于生产环境日志,建议添加颜色检测逻辑

jsoncolor是一个简单但强大的工具,特别适合开发调试时提高JSON数据的可读性。

回到顶部