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表示列印控制台的著色风格,结果如下: