GO小知识之如何作JSON美化

后端http接口测试常须要打印 JSON 返回,可是默认的json展现形式是紧凑型的,不易阅读,或许不少人习惯于使用在线格式化工具。但若是能用代码直接 JSON 美化,为何还要多开一次浏览器呢?git

struct、map 的 Marsh美化

好比有这样一个map或者结构体。github

u := map[string]interface{}{
	"id":   1,
	"name": "poloxue",
}
复制代码

使用GO内置的包 encoding/json。json

若是用 json.Marshal 转化,代码以下:后端

uglyBody, err := json.Marshal(u)
if err != nil {
	panic(err)
}
fmt.Printf("%s\n", uglyBody)
复制代码

打印结果:浏览器

{"id":1,"name":"poloxue"}
复制代码

效果并不友好,若是是复杂的 map,结果将很是乱。bash

可使用json.MarchalIndent,代码以下:工具

body, err := json.MarshalIndent(u, "", "\t")
if err != nil {
	panic(err)
}
fmt.Printf("%s\n", body)
复制代码

\t表示缩进效果。最终的结果以下:测试

{
	"id": 1,
	"name": "poloxue"
}
复制代码

看着舒服了不少。jsonp

JSON的string如何美化?

若是是一个 JSON 字符串怎么办?好比 上面示例中的uglyBody的结果。ui

方法一

使用 encoding/json 包中 Indent 方法。

代码以下:

var out bytes.Buffer
err = json.Indent(&out, uglyBody, "", "\t")
if err != nil {
	panic(err)
}
fmt.Printf("%s\n", out.String())
复制代码

结果以下:

{
	"id": 1,
	"name": "poloxue"
}
复制代码

方法二

github上面有人实现了一个 JSON pretty的包。

地址在:github.com/tidwall/pre…

使用很是简单,代码以下:

fmt.Printf("%s\n", pretty.Pretty(uglyBody))
复制代码

结果以下:

{
  "id": 1,
  "name": "poloxue"
}
复制代码

这个库没有依赖 encoding/json,纯代码解析字符串。并且还能够作 color 美化。

color美化的示例代码:

fmt.Printf("%s\n", pretty.Color(uglyBody, pretty.TerminalStyle))
fmt.Printf("%s\n", pretty.Color(pretty.Pretty(uglyBody), pretty.TerminalStyle))
复制代码

pretty.TerminalStyle表示打印控制台的着色风格,结果以下:

SO 漂亮!

一个JSON美化小工具

利用上面介绍的这些,开发一个很是简单的小工具,代码以下:

package main

import (
	"flag"
	"fmt"

	"github.com/tidwall/pretty"
)

var help bool
var uglyJson string
var indent string

func init() {
	flag.BoolVar(&help, "h", false, "show help")
	flag.StringVar(&uglyJson, "s", "", "json string")
	flag.StringVar(&indent, "i", "\t", "indent string, default tab")
}

func main() {
	flag.Parse()

	if help {
		fmt.Printf("usage:\n\n")
		flag.PrintDefaults()
		return
	}

	var Options = &pretty.Options{Width: 80, Prefix: "", Indent: indent, SortKeys: false}
	fmt.Printf("%s\n", pretty.Color(pretty.PrettyOptions([]byte(uglyJson), Options), pretty.TerminalStyle))
}
复制代码

编译成功以后,就能够用了。好比生成的可执行文件名为 prettyjson,美化

{"id":1,"name":"poloxue"}。
复制代码

执行命令以下:

$ ./jsonpretty -s '{"id":1,"name":"poloxue"}'
复制代码

效果以下:

一些思考

对于 JSON 数据很是大的场景,这种方式能够便于阅读。若是要快速找到某个字段,经过 grep 能够作到,不过这种状况就没法看到上下文了。想到的解决方案,一种是经过 grep -A -B -C 选项实现上下文展现。还有一种方式,若是这个命令支持指定格式化的最大层级就完美了,不过这是须要二次开发的。

相关文章
相关标签/搜索