文档章节

更强的 JsonPath 兼容性及性能测试

刘之西东
 刘之西东
发布于 2019/11/27 13:41
字数 1003
阅读 567
收藏 6

更强的 JsonPath 兼容性及性能测试

最近给自己的json框架snack3添加了json path支持。搞好之后,找了两个市面上流行框架比较性测试,以助自己改进框架的性能和兼容性。

测了一圈之后,发现snack3兼容性良好,性能更是最好的。晚上要喝点小酒庆祝一下!!!

免责声明:我也是个java新手,可能测试得方式不对而造成不科学的结果,可以留言指出来。以下测试数值只对我的电脑有效(配置:Macbook pro 13 2018款 i7+16G+512G)。

Snack3 借签了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。

  • 强调文档树的操控和构建能力
  • 做为中间媒体,方便不同格式互转
  • 高性能Json path查询(兼容性和性能很赞)
  • 支持序列化、反序列化
本案测试用的三个框架及版本:
  • com.alibaba:fastjson:1.2.29
  • com.jayway.jsonpath:json-path:2.2.0
  • org.noear:snack3:3.1.5.9
三份测试数据样本:
  • A:{code:1,msg:'Hello world',data:{list:[1,2,3,4,5], ary2:[{a:2},{a:3,b:{c:'ddd'}}]}}
  • B:[{b:{c:1}}, {b:{d:1}}, {b:{c:2}}, {b:{c:23}}]
  • C:[{c:'aaaa'}, {b:'cccc'}, {c:'cccaa'}]

测试方案:

1.测试伪代码

var text = "...";

//1.预解析json
var obj = JSON.parse(text);

long start = System.currentTimeMillis();
for(int i=0,len=1000000; i<len; i++) {
    //2.执行json path
    JSONPath.eval(obj,"$..."); 
}
//3.100万次的消耗时间(记录的数值就是这个)
long times = System.currentTimeMillis() - start;

System.out.println(times);

2.每个框架、每个表达式各执行4次,并记录后3次消耗时间

3.最后制成对比表格

4.测试结果:

Json path表达式 数据 fastjson json-path snack3
$..a A 529,546,539 2658,2633,2590 225,225,232
$..* A (不兼容1) 3227,3220,3156 306,315,325
data.list[1,4] A 85,90,86 782,798,776 133,137,131
data.list[1:4] A 105,109,109 941,899,947 143,145,146
data.ary2[1].b.c A 60,58,58 929,826,837 84,86,80
data.ary2[*].b.c A (不兼容2) 1105,1025,1050 173,152,155
$..b[?(@.c == 12)] B (不兼容2) 5628,5739,5636 580,535,532
$..c.min() B (不兼容2) (不兼容2) 279,282,285
$[?(@.c =~ /a+/)] C (不兼容2) 3575,3591,3813 444,423,429
$..ary2[0].a A 325,321,319 2522,2551,2591 310,311,314
data.list[?(@ in $..ary2[0].a)] A (不兼容2) 5494,5326,5483 678,674,667

注:

  • 不兼容1 : 直接返回了根节点自己
  • 不兼容2 : 直接异常

总结

  • fastjson 毫无兼容性可言
  • json-path 性能不理想,函数使用局限性大
  • snack3 性能最好,支持两种策略:1.标准模式,保持与json-path兼容效果;2.非标准模式,函数使用余地更大

附1:snack3项目地址:

附2:..及函数表达式的兼容性说明

json-path:(snack3的标准模式同),处理策略如下:
  1. 选择器的执行顺序:(括号里的表达式处理后再聚合)
    • $..(ary2[0].a)
    • $..(c.min()) //如果c不是数组,此处会出错
    • $..(ary2[0][0])
  2. 只能:data.list[?(@ in $..ary2[0].a)]
  3. 只能:在原数组节点上执行函数
snack3:(snack3的非标准模式),处理策略如下:
  1. 选择器的执行顺序:(括号里的表达式处理后再聚合)

    • ($..ary2[0]).a
    • ($..c).min() //c是不是数组都正常 //实际使用中,这种会更方便,同时也兼容其它表达式
    • ($..ary2[0])[0] //这种会引起不同的结果 //不过实际中极少出现
  2. 可以:data.list[?(@ in $..ary2[0].a)]data.list[?(@ == $..ary2[0].a[0])]

  3. 可以:在原数组节点上执行函数 或 查询结果上执行

附3:测试代码

© 著作权归作者所有

刘之西东

刘之西东

粉丝 3
博文 28
码字总数 27523
作品 3
杭州
CTO(技术副总裁)
私信 提问
加载中

评论(0)

接口测试框架优化(三)---支持简单串接口

前言 之前两篇文章,第一篇介绍了主要结构,第二篇介绍了主要代码,最近做了一点小优化。 先贴Github地址,本次主要优化一点: 支持单个简单串接口的测试,即下一个接口的一个参数依赖上一个接...

迈阿密小白
2018/05/11
0
0
spring 3.2.0ga 测试框架

spring3.2终于出ga版了, 发现spring test的改进最大,添加了对 springmvc的测试 看了看文档,将使用方法整理如下: 1,可以使用 @WebAppConfiguration来标明是web应用测试, @ContextConfig...

big-hero
2012/12/20
2K
1
ModuleNotFoundError: No module named 'jsonpath'

刚才在运行时发现没有这个模块而控制台报错 :NameError: name 'jsonpath' is not defined 想着name 'jsonpath'是不是没有安装,然后就在cmd窗口pip install jsonpath 果然 安装完成后pycha......

anlve
2018/01/12
1.7K
0
fastjson 1.2.52 版本发布,Java 实现的 JSON 解析库

fastjson 1.2.52 版本发布了,这又是一个功能增强,以及 bug 修复的版本。主要是增强对 JSONPath 的支持。 Issues 增强JSONPath的支持,增强新的JSONPath.extract API,根据path按需解析JSO...

局长
2018/11/19
2.1K
19
后端服务的查询语言和执行引擎 - GraphQuery

GraphQuery —— 与任何后端服务相关联的查询语言和执行引擎 概述 GraphQuery 是一门易于使用的查询语言,它内置了 Xpath/CSS/Regex/JSONpath 选择器和文本处理功能。 你可以使用简洁的 Grap...

故事细腻_
2018/10/26
836
0

没有更多内容

加载失败,请刷新页面

加载更多

java关键字 —— new、this、static

  java关键字,也叫保留字(50个),是java有特殊意义的标识符,不能用作参数名、变量名、方法名、类名、包名等。   现在我们讲讲其中三个关键字的使用吧~~~ 一、new关键字 1. 用途:新建...

osc_s2b5kacl
29分钟前
21
0
java 集合框架的工具类Collections

sort(),max(),binarySearch(),fill() public class CollectionsDemo { public static void main(String[] args) { replaceAllDemo(); } public static void replaceAll......

osc_r9yyhhqz
30分钟前
25
0
创龙基于Xilinx Kintex-7系列高性价比FPGA开发板散热风扇接口、SATA接口

处理器 Xilinx Kintex-7系列FPGA处理器,芯片型号为XC7K325T-2FFG676I,兼容XC7K160T/410T-2FFG676I,高达326K逻辑单元,840个DSP Slice,硬件如下图: 散热风扇接口 开发板引出1个散热风扇接...

Tronlong创龙
31分钟前
27
0
【经验分享】学习Java的好书有哪些?Java书籍清单

Java书籍是程序员学习提升技能的重要学习渠道,通过书籍Java程序员可以学习当前流行、重要的相关技能。经典的书经受时间的考验,随着岁月的流逝变得越来越重要,让我们不断的学习和进步。 为...

osc_b1kaj6np
32分钟前
22
0
java Collections的reverseOrder(),SynList()

Collections的reverseOrder(比较器)返回相反的比较器,可以逆转比较器。 SynList()可以让非同步变成同步,底层实现synchronized(){}。 swap交换元素位置。 Collections.shuffle()随机重新排序...

osc_2gkfj43j
33分钟前
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部