后端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的包。

地址在:github.com/tidwall/pre…

使用非常简单,代码如下:

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 mainimport ("flag""fmt""github.com/tidwall/pretty"
)var help bool
var uglyJson string
var indent stringfunc 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 选项实现上下文展示。还有一种方式,如果这个命令支持指定格式化的最大层级就完美了,不过这是需要二次开发的。

转载于:https://juejin.im/post/5ceb3f6df265da1b7401da5e

GO小知识之如何做JSON美化相关推荐

  1. json string 格式_GO小知识之如何做JSON美化

    经常有些小知识想分享出来,但又构不成体系,一直觉得文章形式发出不太合适.准备以 "知乎想法" 分享出来,但发现代码展示不太友好.还是发文章吧,该类分享将以 "小知识&qu ...

  2. GO小知识之实例演示 json 如何转化为 map 和 struct

    今天简单谈一些 JSON 数据处理的小知识.近期工作中,因为要把数据库数据实时更新到 elasticsearch,在实践过程中遇到了一些 JSON 数据处理的问题. 实时数据 实时数据获取是通过阿里开 ...

  3. flask json传输失败_GO小知识之实例演示 json 如何转化为 map 和 struct

    简单谈一些 JSON 数据处理的小知识.近期工作中,因为要把数据库数据实时更新到 elasticsearch,在实践过程中遇到了一些 JSON 数据处理的问题. 实时数据 实时数据获取是通过阿里开源的 ...

  4. 要想增加流量需要做的几点,淘宝运营新手必看的免费流量小知识

    要想增加流量,在下认为做几点: 第一.内功上做一些优化 优化宝贝的标题.你可以找到一些关键词.在业务人员选词助手中,选择一些搜索热度高.竞争少的关键词,自己自由组合起来做新的宝贝标题喔. 2.主图和详 ...

  5. 近视手术,是福音还是噩梦,知道这些危害,你还敢做吗,眼科小知识都在这里

    Hi,大家好,这是一篇非技术性文章,这篇主要想介绍激光近视手术的危害,让每个想做近视手术的朋友心里有个预期,当然这些问题发生的概率可能很小,但是落在你身上就是 100%,请看完之后在决定是否做手术. ...

  6. 计算机组装电源线排,电脑装机小知识,机箱如何完美走线-做第一期的简单补充...

    原标题:电脑装机小知识,机箱如何完美走线-做第一期的简单补充 本期继续要讲的是,对于电脑里机箱走线,我已经做过一期对于电脑机箱走线的文章,还没有看过第一期的能够在本文末尾找到我的连接. 机箱走线欠妥会 ...

  7. 与建行进行善付通支付接口小知识

    与建行进行善付通支付接口小知识 1.测试环境 目前做的工作都是为了更顺利的与生产环境进行对接. 2.生产环境 测试环境没问题后,申请生产环境的开发==一般需要三到五天==: 3.感觉最坑人的地方 1. ...

  8. 聊聊前端的冷门小知识 - 李游Leo公开课(2020-4-8 和 2020-4-10) 笔记

    冷门小知识 01 div 的伪类 后面用一个 : 和用两个:: 效果相同. <style type="text/css">div{width: 100px;height ...

  9. 小知识:教你认识N种手机“彩屏”IT168索尼爱立信论坛

    目前,大多数 彩屏手机采用的液晶从材质上可分为如以下几种:STN,TFT,TFD,UFB. %p.@5O$a$`%N5P*S6ssebbs.it168.com他们分别有着各自的特点----- %F7m ...

最新文章

  1. 机器学习入门书籍、课程推荐
  2. NotePad++编译代码
  3. Python对QQ音乐进行爬取并进行数据分析
  4. Charles-proxy-4.2.1-win64 - 破解
  5. SpringBoot-从入门到放弃(二) 开发环境的搭建
  6. HTTP缓存(HTTP Cacheing):缓存控制(Cache-Control)
  7. java in think 多态问题
  8. Futter基础第4篇: 实现基础列表组件、 水平列表组件 、 图标组件【ListView、Axis.vertical、Axis.horizontal】
  9. 转载--如何使用# ## ... _ _VA_ARGS_ _
  10. java高级工程师 考试_JAVA高级工程师笔试题及答案
  11. R语言编写用户自定义函数:R语言编写用户自定义函数计算变异系数(coefficient of variation)、输入为向量
  12. 新能源汽车车载智能终端t-box
  13. (笔记)数据结构——顺序表
  14. 进阶-第18__深度探秘搜索技术_基于slop参数实现近似匹配以及原理剖析和相关实验
  15. 传图识字有次数限制吗_告诉你一个免费的微信小程序,可以传图识字
  16. 利用poi 读取excel通用工具类
  17. 学习MATLAB的第一天,梳理一些见到的函数。1.matlab中sin、cos、tan三角函数问题。2.abs函数。3.vpa函数。4.disp函数。5.class函数。6.logical函数。
  18. 手机玩exe游戏的模拟器_如何在手机上玩全面战争模拟器等电脑付费游戏?
  19. 生物实验室搬迁需要注意什么
  20. 【Rust日报】2022-12-11 EDMA:用 Rust 编写的嵌入式数据库管理终端应用程序

热门文章

  1. 计算机应用基础一九春在线作业,西电17春《计算机应用基础(一)》在线作业答案...
  2. python基于pingouin包进行统计分析:使用ancova函数执行协方差分析、covar参数设置单个协方差变量、以dataframe的形式输出分析结果(包含SS、自由度、F值、p值、np2等)
  3. springboot动态传入表名查询
  4. Java中的equals(),==,compareTo()和compare()
  5. 达芬奇系列DSP——CCS_V5安装技术文档
  6. 【Python】python练习
  7. IDS11.50在线重建sysadmin库
  8. 前端网页emoji方案:twemoji简单使用(推特emoji)
  9. 构成网页各个主要标签的作用
  10. OPENMPI并行库安装