Go 小知识之 JSON 美化小工具
波罗学 · · 1496 次点击 · · 开始浏览后端http接口测试常需要打印 JSON 返回,但是默认的json展示形式是紧凑型的,不易阅读,或许很多人习惯于使用在线格式化工具。但如果能用代码直接 JSON 美化,为什么还要多开一次浏览器呢?
struct、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/pr...
使用非常简单,代码如下:
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 选项实现上下文展示。还有一种方式,如果这个命令支持指定格式化的最大层级就完美了,不过这是需要二次开发的。
波罗学的微信公众号
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
后端http接口测试常需要打印 JSON 返回,但是默认的json展示形式是紧凑型的,不易阅读,或许很多人习惯于使用在线格式化工具。但如果能用代码直接 JSON 美化,为什么还要多开一次浏览器呢?
struct、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/pr...
使用非常简单,代码如下:
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 选项实现上下文展示。还有一种方式,如果这个命令支持指定格式化的最大层级就完美了,不过这是需要二次开发的。
波罗学的微信公众号