GO小知識之如何做JSON美化
經常有些小知識想分享出來,但又構不成體系,一直覺得文章形式發出不太合適。準備以 "知乎想法" 分享出來,但發現代碼展示不太友好。還是發文章吧,該類分享將以 "小知識" 為前綴。
後端http介面測試常需要列印 JSON 返回,但是默認的json展示形式是緊湊型的,不易閱讀,或許很多人習慣於使用在線格式化工具。但如果能用代碼直接 JSON 美化,為什麼還要多開一次瀏覽器呢?
非string類型的結構體、map等類型的Marsh美化
比如有這樣一個map或者結構體。
u := map[string]interface{}{
"id": 1,
"name": "poloxue",
}
使用GO內置的包 encoding/json。
如果用 json.Marshal 轉化,代碼如下:
uglyBody, err := json.Marshal(u)
if err != nil {
panic(err)
}
fmt.Printf("%s
", uglyBody)
列印結果:
{"id":1,"name":"poloxue"}
效果並不友好,如果是複雜的 map,結果將非常亂。
可以使用json.MarchalIndent,代碼如下:
body, err := json.MarshalIndent(u, "", " ")
if err != nil {
panic(err)
}
fmt.Printf("%s
", body)
表示縮進效果。最終的結果如下:
{
"id": 1,
"name": "poloxue"
}
看著舒服了很多。
JSON的string如何美化?
如果是一個 JSON 字元串怎麼辦?比如 上面示例中的uglyBody的結果。
方法一
使用 encoding/json 包中 Indent 方法。
代碼如下:
var out bytes.Buffer
err = json.Indent(&out, uglyBody, "", " ")
if err != nil {
panic(err)
}
fmt.Printf("%s
", out.String())
結果如下:
{
"id": 1,
"name": "poloxue"
}
方法二
github上面有人實現了一個 JSON pretty的包。
地址在:https://github.com/tidwall/pretty
使用非常簡單,代碼如下:
fmt.Printf("%s
", pretty.Pretty(uglyBody))
結果如下:
{
"id": 1,
"name": "poloxue"
}
這個庫沒有依賴 encoding/json,純代碼解析字元串。而且還可以做 color 美化。
color美化的示例代碼:
fmt.Printf("%s
", pretty.Color(uglyBody, pretty.TerminalStyle))
fmt.Printf("%s
", pretty.Color(pretty.Pretty(uglyBody), pretty.TerminalStyle))
pretty.TerminalStyle表示列印控制檯的著色風格,結果如下: