给JSONObject添加自定义遍历方法
经过了Groovy动态添加方法和属性及Spock单测的铺垫,今天用fastjson
为例,演示如何给JSONObject
添加一个自定义的方法,来帮助提高编程效率。
需求
在fastjson
的com.alibaba.fastjson.JSONObject
其实并没有直接给出遍历的方法,如果想在接口测试的过程中,需要打印JSON响应中的部分信息,都需要单独写一个for循环或者Lambda语法表达式,例如:
演示JSON数据
def params = new JSONObject()
params.code= 1
params.msg= "FunTester"
def data = new JSONObject()
data.name = "张三"
data.age = 22
params.data = []
params.data << data
params.data << data.clone()
params.data << data.clone()
打印内容:
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "msg":"FunTester",
> ① . "code":1,
> ① . "data":[
> ② . . . {
> ② . . . "name":"张三",
> ② . . . "age":22
> ① . },
> ① . {
> ② . . . "name":"张三",
> ② . . . "age":22
> ① . },
> ① . {
> ② . . . "name":"张三",
> ② . . . "age":22
> ② . . . }
> ① . ]
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
直接实现输出方法
这里我们还是通过groovy.lang.MetaClass
来实现。
JSONObject.metaClass.fun = {
def array = params.getJSONArray("data")
array.each {
sleep(1.0)
output(Time.getNow(Time.DEFAULT_FORMAT.get()))
output(it)
}
}
params.fun()
控制台输出:
INFO-> main 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> main 2021-10-21 19:19:36
INFO-> main
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "name":"张三",
> ① . "age":22
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
INFO-> main 2021-10-21 19:19:37
INFO-> main
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "name":"张三",
> ① . "age":22
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
INFO-> main 2021-10-21 19:19:38
INFO-> main
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "name":"张三",
> ① . "age":22
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
Process finished with exit code 0
使用闭包灵活实现
这里我使用的是groovy.lang.Closure
作为闭包的实现类,毕竟这个功能只能在Groovy脚本中实现。具体的文章有兴趣的可以翻一翻以前的文章。这次我用了两种闭包的实现方式,其中it
关键字简直就是灵魂,非常推荐大家学Groovy。脚本代码如下:
JSONObject.metaClass.fun2 = {f ->
def array = params.getJSONArray("data")
array.each {
f(it)
}
}
params.fun2({x -> output(x.get("name"))})
params.fun2({output(it.get("age"))})
控制台输出:
INFO-> main 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> main 张三
INFO-> main 张三
INFO-> main 张三
INFO-> main 22
INFO-> main 22
INFO-> main 22
Process finished with exit code 0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2020-10-28 SonarQube8.3中的Maven项目的测试覆盖率报告