Go 小知识之 JSON 美化小工具

白净水金刚
• 阅读 3381

后端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表示打印控制台的着色风格,结果如下:

Go 小知识之 JSON 美化小工具

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"}'

效果如下:

Go 小知识之 JSON 美化小工具

一些思考

对于 JSON 数据非常大的场景,这种方式可以便于阅读。如果要快速找到某个字段,通过 grep 可以做到,不过这种情况就无法看到上下文了。想到的解决方案,一种是通过 grep -A -B -C 选项实现上下文展示。还有一种方式,如果这个命令支持指定格式化的最大层级就完美了,不过这是需要二次开发的。


Go 小知识之 JSON 美化小工具

点赞
收藏
评论区
推荐文章
kenx kenx
4年前
SpringBoot 默认json解析器详解和字段序列化自定义
前言在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理SpringBoot默认的json解析方案我们知道在springboot中有默认的json解析器,SpringBoot中默认使用的Json解析技术框架是ja
kenx kenx
4年前
Spring Boot 无侵入式 实现RESTful API接口统一JSON格式返回
前言现在我们做项目基本上中大型项目都是选择前后端分离,前后端分离已经成了一个趋势了,所以总这样·我们就要和前端约定统一的api接口返回json格式,这样我们需要封装一个统一通用全局模版api返回格式,下次再写项目时候直接拿来用就可以了约定JSON格式一般我们和前端约定json格式是这样的json"code":200,"message
Stella981 Stella981
4年前
Go生成json、解析json和多维json数组解析
go生成和解析json结构是按结构体模式解析的,所以结构体类型一定要多练习熟悉。完整代码(可以运行)://buildignorepackagemainimport("encoding/json""fmt")typePersonstruct
Wesley13 Wesley13
4年前
1.利用BeanMap进行对象与Map的相互转换
javabean与map的转换有很多种方式,比如:1、通过ObjectMapper先将bean转换为json,再将json转换为map,但是这种方法比较绕,且效率很低,经测试,循环转换10000个bean,就需要12秒!!!不推荐使用2、通过java反射,获取bean类的属性和值,再转换到map对应的键值对中,这种方法次之,但稍微有点麻烦3、通过
Easter79 Easter79
4年前
SpringMvc @JsonView 使用方式
准确来说,@JsonView注解不是Spring的,它位于jacksonannotation包中;作用:SpringMvc使用@ResponseBody将结果以json返回客户端, 有些实体类的某些字段可以不被包括在JSON中;思考了这种情况可能适用的情形:有多方调用这个接口,需要针对不同业务场景返回不同形式的JSON,但是这种情况的话只拷贝需要
Stella981 Stella981
4年前
AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互)
前后端分离实现前后端分离的好处就不用多说了,前后端那么JavaWeb项目前后端分离是怎么实现的呢?1.浏览器发送请求2.直接到达html页面(前端控制路由与渲染页面,整个项目开发的权重前移)3.html页面负责调用服务端接口产生数据(通过ajax等等,后台返回json格式数据,json数据格式因为简洁高效而取代xml)
Stella981 Stella981
4年前
AspNetCore Json序列化设置
AspNetCore中的Json序列化处理已经默认使用_Newtonsoft.Json_库了...比如像MVC中:publicI不过使用过程中会发现一些问题,其实这算默认设置吧:Json序列化后的字段格式会变成小驼峰形式Json序列化时的日期时间格式化没有处理循环引用的问题,比如EntityF
Wesley13 Wesley13
4年前
Fastjson内幕
原文出处:http://wenshao.iteye.com/blog/1142031JSON协议使用方便,越来越流行。JSON的处理器有很多,为什么需要再写一个呢?因为我们需要一个性能很好的JSONParser,希望JSONParser的性能有二进制协议一样好,比如和protobuf一样,这可不容易,但确实做到了。有人认为这从原理上就是不可能的,但是
Stella981 Stella981
4年前
FastJson 反序列化注意事项
问题描述使用fastJson对json字符串进行反序列化时,有几个点需要注意一下:反序列化内部类反序列化模板类0\.Getter/Setter问题如我们希望返回的一个json串为"name":"name","isDeleted":true,"isEmpty":1
API 小达人 API 小达人
2年前
JSON 格式的接口测试流程【Eolink Apikit】
在进行JSON格式的接口测试时,需要使用工具发送HTTP请求并获取响应。测试工具可以是单独的测试框架,如EolinkApikit。测试人员需要根据接口文档和测试用例编写测试脚本,然后运行测试并分析结果,以确保接口的质量和稳定性。当我们后端需要从前端拿到这些JSON数据,我们应该如何测试自己的接口呢?今天就来浅浅探讨一下JSON格式接口测试的流程。
Java常用的JSON序列化与反序列化工具实践
JSON简介:JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,通常用于在不同系统之间传输数据。它基于JavaScript对象语法,但已成为一种独立于语言的格式。JSON数据以键值对的形式组织,易于阅读和编写。为什么要
白净水金刚
白净水金刚
Lv1
你来自来,去自去,你是自由的,风都无法将你圈养
文章
4
粉丝
0
获赞
0