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

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

后端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("%sn", uglyBody)

打印结果:

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

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

可以使用json.MarchalIndent,代码如下:

body, err := json.MarshalIndent(u, "", "t")
if err != nil {panic(err)
}
fmt.Printf("%sn", 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("%sn", out.String())

结果如下:

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

方法二

github上面有人实现了一个 JSON pretty的包。

地址在:https://github.com/tidwall/pretty

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

fmt.Printf("%sn", pretty.Pretty(uglyBody))

结果如下:

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

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

color美化的示例代码:

fmt.Printf("%sn", pretty.Color(uglyBody, pretty.TerminalStyle))
fmt.Printf("%sn", pretty.Color(pretty.Pretty(uglyBody), pretty.TerminalStyle))

pretty.TerminalStyle表示打印控制台的着色风格,结果如下:

8fb8b7389b3516de54c00f7ab2cd4f4a.png

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:nn")flag.PrintDefaults()return}var Options = &pretty.Options{Width: 80, Prefix: "", Indent: indent, SortKeys: false}fmt.Printf("%sn", pretty.Color(pretty.PrettyOptions([]byte(uglyJson), Options), pretty.TerminalStyle))
}

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

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

效果如下:

e59f81b90407d2422b78df8352fcad37.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 对象引用 弱引用吗_谈谈Java对象的强引用,软引用,弱引用,虚引用分别是什么...

整体结构java提供了4中引用类型,在垃圾回收的时候,都有自己的各自特点。为什么要区分这么多引用呢,其实这和Java的GC有密切关系。强引用(默认支持模式)把一个对象赋给一个引用变量,这个引用变量就是一个强引用。强引用是我们最常见…

python图像几何变换_Python 图像处理 OpenCV (5):图像的几何变换

前文传送门: 图像缩放 图像缩放只是调整图像的大小,为此, OpenCV 为我们提供了一个函数 cv.resize() ,原函数如下: resize(src, dsize, dstNone, fxNone, fyNone, interpolationNone) src 表示的是输入图像&#xff0c…

linux中python编辑器_Linux下9款最好的Markdown编辑器

首先, Markdown是使用Perl编写的,简单、轻量级的工具,允许用户编写纯文本格式和高效的html或者XHTML。它实际上是一个易于阅读,易于编写纯文本的语言和文本到HTML的转换的软件工具。 希望你有一点了解,Mrakdown是什么&…

java监听数据库操作_第十六篇——JDBC操作数据库之监听器

JavaWeb应用中,很多的地方都和session有关。因此session相关的事件监听器,在日常工作中非常有用。有时候我们需要统计当前在线的人数和访问人数总数,此时就可以使用监听器技术来很简单的实现这种功能。注意:session并不是浏览器关…

加装的硬盘进入后点不了文件夹_在外接移动硬盘上制作win to go教程

有很多使用Mac Book的小伙伴免不了要使用一些Windows下才有的软件(强行暗示Solidworks),这类的大型软件在虚拟机当中运行稳定性又不太好,所以双系统便成了许多人的选择,但boot camp让本就拮据的机身内存雪上加霜,由此win to go便成…

python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条

F12打开网页调试工具:选择“网络”选项卡后,发现有很多响应,我们筛选一下,只看XHR响应。(XHR是Ajax中的概念,表示XMLHTTPrequest)然后我们发现少了很多链接,随便点开一个看看&#x…

openjdk怎么执行java命令_Ubuntu 18.04 上使用 OpenJDK 安装并运行 Tomcat

在Linux上安装与卸载JDK和JRE,两种常用方法:一、通过 apt-get 命令在线进行安装与卸载(会自动配置好环境变量)二、通过下载并解压 .tar.gz 包进行手动安装与手动卸载(需要手动配置环境变量)注:javac命令是JDK中的,java命令是JRE中…

vscode卸载background插件_萌妹程序员鼓励师24小时在线陪你写代码,给我吹爆这个VSCode插件...

开源最前线(ID:OpenSourceTop) 猿妹综合整理项目地址:https://github.com/SaekiRaku/vscode-rainbow-fart最近,Github上有一个名为Rainbow Fart的VSCode 插件被玩坏了,有了这个插件,程序员鼓励师这个物种就要灭绝了。为…

java 获取td_[Java教程]jQuery获取table表中的td标签

[Java教程]jQuery获取table表中的td标签0 2017-07-28 00:00:08首先我来介绍一下我遇到的问题1.当有一个table表包含了标签,标签,大致可以认为是这样的:scene.ID scene.SceneName scene.QRUrl scene.LocalUrl if (!string.IsNullOrWhiteSpace(…

引用另一模板的宏_生信人值得拥有的编程模板Shell

前言“工欲善其事必先利其器”,生信工程师每天写代码、搭流程,而且要使用至少三门编程语言,没有个好集成开发环境(IDE,Integrated Development Environment)那怎么行?本人使用过vim, editplus, ultraedit, notepad, su…

avlib java_fatal error: libavutil/avconfig.h: No such file...

根据这位仁兄的记录,可以在android程序里调用ffmpeg的avcodec_version()函数;下载了最新版的ffmpeg源码(2.4.1),在cygwin里用NDK编译时可能会报错,报错如下;your_nameAP-CHN-LP140129 /cygdrive/c/Workspace_my/TestAp…

python 绘制分布直方图_统计学中常见的4种抽样分布及其分布曲线(Python绘制)...

现代统计学奠基人之一、英国统计学家费希尔(Fisher)曾把抽样分布、参书估计和假设检验看作统计推断的三大中心内容。统计学中,需要研究统计量的性质,并评价一个统计推断的优良性,而这些取决于其抽样分布的性质,所以,抽…

php 文件 不更新,php页面不刷新更新数据

php页面不刷新更新数据php页面不刷新更新数据实现起来很简单,我们可以使用前端的ajax技术。ajax作用:ajax技术的目的是让javascript发送http请求,与后台通信,获取数据和信息。实现前后端分离。ajax技术的原理是实例化xmlhttp对象&…

master节点部署pod_小伙!Kubernetes 部署如此简单,你看完全明白了

将项目迁移到k8s平台是怎样实现的?制作镜像控制器管理PodPod数据持久化暴露应用对外发布应用日志/监控1、制作镜像分为三步第一基础镜像,是基于哪个操作系统,比如Centos7或者其他的第二步中间件镜像,比如服务镜像,跑的像nginx服务…

c++从入门到精通_资料下载:从入门到精通,手把手教你学DSP

学习一个东西首先是了解它,比如DSP到底是什么?用在什么地方?怎么用?和单片机特点有那些相同与不同?开发需要注意什么?想了解清楚这些问题自然就清楚比较清楚的认识DSP。DSP,因为它是用来做数据处…

php mysql存中文,PHP+MySQL存储数据常见中文乱码问题小结

PHPMySQL存储数据常见中文乱码问题小结本文实例总结了PHPMySQL存储数据常见中文乱码问题。分享给大家供大家参考,具体如下:PHPMySQL出现中文乱码的常见原因:1. MYSQL数据库的编码是utf8,与PHP网页的编码格式不一致,就会造成MYSQL中的中文乱码。2. 使用MY…

dbf文件怎么创建_ThinkPHP6开发博客实战入门(三),创建admin后台入口

打开创建的应用根目录:E:phpstudy_proWWWp(注意,往后我所说的根目录就是此路径)简单说一下tp6的目录结构app应用目录主要存放控制器文件;config配置目录主要存放全局配置文件;public入口目录主要存放入口或者资源文件;…

没有返回值的方法mock怎么写_【方法】小学生怎么写读书笔记?

什么是读书笔记读书笔记,是指人们在阅读书籍或文章时,遇到值得记录的东西和自己的心得、体会,随时随地把它写下来的一种文体。古人有条著名的读书治学经验,叫做读书要做到:眼到、口到、心到、手到。这“手到”就是读书…

php e error,E_ERROR定义与用法汇总

前言最近由于项目需要,需要读取一个含有中文的txt文档,完了还要保存文件。文档之前是由base64编码,导致所有汉字读取显示乱码。项目组把base64废弃之后,先后出现两个错误:ascii codec cant encode characters in posit…

delphi中的函数传参如何传枚举参数_我是这样使用SpringBoot(API传参)

spring boot 传参spring boot 中的Controller或者RestController接收参数的方法是一样的。这章目标是对几种常用的传参都写个例子。创建package: com.biboheart.demos.api,这个包里放置API接口的RestController在com.biboheart.demos.api包中创建一个class: ParamCo…