赞
踩
问题:
在一个缓存抓取的项目中,大量http请求返回大量json格式数据,json的解析变得非常慢,解析速度跟不上
http返回的速度。
解决办法:
1.升级配置 (业务需求是缓存越快越好,不适合)
2换一种解析json的方式(阿里的fastjson速度已经属于前列).
最后:换一种解析json的方式
由于很忙,长的博客很少人爱看,我在这里就简单说一下我怎么想的,怎么做的。fastjson的使用大家都是知道的,json字符串转换成fastobject对象后就可以用了,具体就是用java的反射把json反射成对象,然后用get方法获取对应的属性值,如果要转化的json是很大的话(2M左右的json)就很慢了,小伙伴可以打个debug体验一下.
我所想到的办法就是截取字符串。也许你会说String类提供的截取放法,你去截取长字符串就很麻烦了,截取json数据,你不要开玩笑了。你怎么截取?
首先我先说明一下。只要是json数据,它就是固定的排列规则, 如果排列规则不对,那么他就不是json!简单的例子如下:
{"url":"www.www.com","name":"json数据","array":{"JSON校验":"hello","Cron生成":"hello","JS加密解密":"hello"},"boolean":true,"null":null,"number":123,"object":{"a":"b","c":"d","e":"f"}}
它的规则是这样的:
1.一个值肯定是key和value的形式表达在字符串中,key一定是“key”: 的形式表达的,那么key的value一定就是:"value" 的形式来表达的
2.相邻的两个key值,中间肯定是有 "," 的存在
3.一个key数组一定是["str1","str2","str3"]的存在
首先我们来罗列一下使用fastjson解析json的过程如下:
获取json------>转换fastjson对象----->一get("key")获取值
在这个过程中你不难发现,你想要得到的值,你是肯定知道对应的key的,我们可以用你知道的key来准确定位对应的value在json字符串中准确的位置。
String json=".......";
json.indexOf("\""+key+"\"");
具体怎样获取value和处理复杂的数组以及value中带有特殊符号的方法,大家可以看我的源码。此方法经中用到的算法都是串行的,经过测试,以及我在实际中的应用,速度至少比fastjson要快上2倍,json数据越大此方法的优势就越明显,而且cpu的消耗也是非常低的,如果你愿意加入并行算法也可以的,当然这也是我以后的想法,源码很简单就是普通的java项目,没有任何第三方的依赖,已经上传到github上大家可以去下载,或者提出建议。https://github.com/jiaowowenrou/JumperJsonXml
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。