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

非string类型的结构体、map等类型的Marsh美化

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

  1. u := map[string]interface{}{
  2. "id": 1,
  3. "name": "poloxue",
  4. }

使用GO内置的包 encoding/json。
如果用 json.Marshal 转化,代码如下:

  1. uglyBody, err := json.Marshal(u)
  2. if err != nil {
  3. panic(err)
  4. }
  5. fmt.Printf("%s\n", uglyBody)

打印结果:

  1. {"id":1,"name":"poloxue"}

效果并不友好,如果是复杂的 map,结果将非常乱。

  1. body, err := json.MarshalIndent(u, "", "\t")
  2. if err != nil {
  3. panic(err)
  4. }
  5. fmt.Printf("%s\n", body)

\t表示缩进效果。最终的结果如下:

  1. {
  2. "id": 1,
  3. "name": "poloxue"
  4. }

看着舒服了很多。

JSON的string如何美化?

如果是一个 JSON 字符串怎么办?比如 上面示例中的uglyBody的结果。
方法一
使用 encoding/json 包中 Indent 方法。
代码如下:

  1. var out bytes.Buffer
  2. err = json.Indent(&out, uglyBody, "", "\t")
  3. if err != nil {
  4. panic(err)
  5. }
  6. fmt.Printf("%s\n", out.String())

结果如下:

  1. {
  2. "id": 1,
  3. "name": "poloxue"
  4. }

方法二
github上面有人实现了一个 JSON pretty的包。
地址在:https://github.com/tidwall/pretty
使用非常简单,代码如下:

  1. fmt.Printf("%s\n", pretty.Pretty(uglyBody))

结果如下:

  1. {
  2. "id": 1,
  3. "name": "poloxue"
  4. }

这个库没有依赖 encoding/json,纯代码解析字符串。而且还可以做 color 美化。
color美化的示例代码:

  1. fmt.Printf("%s\n", pretty.Color(uglyBody, pretty.TerminalStyle))
  2. fmt.Printf("%s\n", pretty.Color(pretty.Pretty(uglyBody), pretty.TerminalStyle))

pretty.TerminalStyle表示打印控制台的着色风格,结果如下:
image.png
SO 漂亮!

一个JSON美化小工具

利用上面介绍的这些,开发一个非常简单的小工具,代码如下:

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/tidwall/pretty"
  6. )
  7. var help bool
  8. var uglyJson string
  9. var indent string
  10. func init() {
  11. flag.BoolVar(&help, "h", false, "show help")
  12. flag.StringVar(&uglyJson, "s", "", "json string")
  13. flag.StringVar(&indent, "i", "\t", "indent string, default tab")
  14. }
  15. func main() {
  16. flag.Parse()
  17. if help {
  18. fmt.Printf("usage:\n\n")
  19. flag.PrintDefaults()
  20. return
  21. }
  22. var Options = &pretty.Options{Width: 80, Prefix: "", Indent: indent, SortKeys: false}
  23. fmt.Printf("%s\n", pretty.Color(pretty.PrettyOptions([]byte(uglyJson), Options), pretty.TerminalStyle))
  24. }

编译成功之后,就可以用了。比如生成的可执行文件名为 prettyjson,美化 {“id”:1,”name”:”poloxue”}。

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

效果如下:
image.png

原文 https://zhuanlan.zhihu.com/p/65905512