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 選項實現上下文展現。還有一種方式,若是這個命令支持指定格式化的最大層級就完美了,不過這是須要二次開發的。

相關文章
相關標籤/搜索