GO小知识之如何做JSON美化

poloxue · · 2896 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

[原文地址](https://zhuanlan.zhihu.com/p/65905512) 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\n", uglyBody) ``` 打印结果: ``` {"id":1,"name":"poloxue"} ``` 效果并不友好,如果是复杂的 map,结果将非常乱。 可以使用json.MarchalIndent,代码如下: ``` body, err := json.MarshalIndent(u, "", "\t") if err != nil { panic(err) } fmt.Printf("%s\n", body) ``` \t表示缩进效果。最终的结果如下: ``` { "id": 1, "name": "poloxue" } ``` 看着舒服了很多。 ## JSON的string如何美化? 如果是一个 JSON 字符串怎么办?比如 上面示例中的uglyBody的结果。 ### 方法一 使用 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的包。 地址在:https://github.com/tidwall/pretty 使用非常简单,代码如下: ``` 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表示打印控制台的着色风格,结果如下: ``` ![image.png](https://static.studygolang.com/190516/af63ab631516e497cb8b35c546ed6260.png) 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"}' ``` 效果如下: ![image.png](https://static.studygolang.com/190516/ac62f7716b81f4912104580612697708.png)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2896 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传