70鞋子,极致的阴阳师速度极致,还有比这快的么

2778人阅读
Android(90)

转载请注明出处:
& & 在前面的两篇文章中,我们介绍了Json数据格式和系统自带Json以及Google的Gson项目,如果能学会这些东西,基本能满足工作需求了。但是,程序员都有追求极致效率的嗜好,在满足了基本需求之后,我们会考虑能不能再优化一下效率呢?当然!今天这篇文章要介绍的,就是在数据量比较大的时候,比Gson的解析效率高近10倍的Json数据解析框架— —Jackson!
& & 下面是一个大神关于几个常见的Json数据的解析速度的测试结果,原文请戳
& & 我们从上图可以看出,在大数据量的情况下,Jackson的速度比Gson的解析速度快了不是一点半点,所以,最推荐大家使用的就是Jackson框架,来,咱们一起看看怎么用!
 & &我们先介绍一下常用的几个类的功能:
JsonFactory:这个类是Jackson项目主要的工厂方法,主要用于配置和构建解析器(比如 JsonParser)和生成器(比如 JsonGenerator),这个工厂实例是线程安全的,如果有配置的话,可以重复使用。
JsonGenerator:这个类主要是用来生成Json格式的内容的,我们可以使用JsonFactory的方法生成一个实例。
JsonParser:这个主要是用来读取Json格式的内容,并且完成解析操作的,我们可以使用JsonFactory的方法生成一个实例。
ObjectMapper:这个类提供了Java对象和Json之间的转化,主要通过JsonParser和JsonGenerator实例来完成实际的对Json数据的读写操作。这个类是ObjectCodec的子类,主要的实现细节都在ObjectCodec里面。而且这个类可以重复使用,所以一般会创建这个类的一个单例模式,比如下面的代码
package com.example.
import org.codehaus.jackson.map.ObjectM
* @ClassName: com.example.jsondemo.JacksonMapper
* @Description:ObjectMapper的单例模式
* @author zhaokaiqiang
下午4:06:52
public class JacksonMapper {
private static final ObjectMapper mapper = new ObjectMapper();
private JacksonMapper() {
public static ObjectMapper getInstance() {
& & 我们在下面的代码中,我们经常使用这个单例模式,大家不要迷惑。
1.简单对象的Json数据生成
 & &这里所说的简单对象指的是单一对象或者是对象的集合类。
& & 下面我们先看代码实现,然后讲解一些细节。
& & 实现的方法有两种,先看第一种,如下:
&span style=&font-size: 18&&public String getJsonString(Object object) throws Exception {
return JacksonMapper.getInstance().writeValueAsString(object);
}&/span&& & 在这种方法中,我们直接使用ObjectMapper类的writeValueAsString(),就可以把对象的json格式作为返回值直接返回。
& & 除此之外,我们还可以使用第二种方法,代码如下
public String getJsonString1(Object object) throws Exception {
ObjectMapper mapper = JacksonMapper.getInstance();
StringWriter sw = new StringWriter();
JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
mapper.writeValue(gen, object);
gen.flush();
gen.close();
return sw.toString();
}& & 这种方法是使用JsonGenerator和StringWriter对象,通过ObjectMapper,把转换好的Json数据写到了StringWriter里面,然后toString()就可以拿到我们需要的Json数据了。
& & 这里再多说一句,从第二种方法的方式里,我们可以看到操作非常像Java里面的IO流的处理,实际上,Jackson确实是以流的方式对数据进行处理的,这也是它处理速度这么快的原因所在。
& & 因为第一种方法更加的简洁,所以推荐大家使用。
& & 下面是测试代码和测试结果
* 集合对象
* @throws Exception
public void objectsToJson() throws Exception {
Person p = new Person(&zhaokaiqiang&, 22, new Birthday());
ArrayList&Person& persons = new ArrayList&Person&();
persons.add(p);
persons.add(p);
persons.add(p);
Log.d(TAG, getJsonString(persons));
* 单一对象
* @throws Exception
public void objectToJson() throws Exception {
Person p = new Person(&zhaokaiqiang&, 22, new Birthday());
Log.d(TAG, getJsonString(p));
测试结果如下
&span style=&font-size: 18&&{&name&:&zhaokaiqiang&,&birthday&:{&day&:19,&month&:1,&year&:1992},&age&:22}
&/span&&span style=&font-size: 18&&[{&name&:&zhaokaiqiang&,&birthday&:{&day&:19,&month&:1,&year&:1992},&age&:22},{&name&:&zhaokaiqiang&,&birthday&:{&day&:19,&month&:1,&year&:1992},&age&:22},{&name&:&zhaokaiqiang&,&birthday&:{&day&:19,&month&:1,&year&:1992},&age&:22}]&/span&
2.复杂对象的Json数据的生成
& & 这里所说的复杂对象指的是由多种不同数据类型的数据组成的数据,下面我们将介绍如何创建这种复杂对象的Json数据。
 & &我们在前面介绍过,Json格式分为Object形式和Array形式,我们将分别介绍这两种格式如何生成。
& & (1)Object格式
& & 我们先直接看下面的代码吧!
* 生成Object形式的json
* @throws Exception
public void createObjectJson() throws Exception {
Person p = new Person(&zhaokaiqiang&, 22, new Birthday());
StringWriter stringWriter = new StringWriter();
// 必须通过这种方式获取
JsonGenerator jsonGenerator = JacksonMapper.getInstance()
.getJsonFactory().createJsonGenerator(stringWriter);
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(&name&, &zhaokaiqiang&);
jsonGenerator.writeNumberField(&age&, 22);
jsonGenerator.writeObjectField(&person&, p);
jsonGenerator.writeEndObject();
jsonGenerator.flush();
jsonGenerator.close();
Log.d(TAG, stringWriter.toString());
}& & JsonGenerator是一个生成器,如果我们想创建复杂的Json对象,我们就可以是用这个类来完成。但是有一点必须要注意,就是获取JsonGenerator的方式,我们必须使用ObjectMapper的getJsonFactory(),然后创建一个JsonGenerator,否则如果我们使用writeObjectField()方法的时候,会报下面的异常
java.lang.IllegalStateException: No ObjectCodec defined for the generator, can only serialize simple wrapper types (type passed com.example.jsondemo.Person)
& & 上面的其余代码很简单,只要根据不同的数据类型,调用对应的write___Field()即可。
& & 下面是测试结果
&span style=&font-size: 18&&{&name&:&zhaokaiqiang&,&age&:22,&person&:{&name&:&zhaokaiqiang&,&birthday&:{&day&:19,&month&:1,&year&:1992},&age&:22}}
& & (2)Array格式
 & &下面我们介绍如何生成Array格式的Json数据,其实和上面的差不多。
& & 下面是代码实现:
* 创建Array形式的json
* @throws Exception
public void createArrayJson() throws Exception {
Person p = new Person(&zhaokaiqiang&, 22, new Birthday());
StringWriter stringWriter = new StringWriter();
// 只能通过这种方式获取
JsonGenerator jsonGenerator = JacksonMapper.getInstance()
.getJsonFactory().createJsonGenerator(stringWriter);
jsonGenerator.writeStartArray();
jsonGenerator.writeString(&zhaokaiqiang&);
jsonGenerator.writeNumber(22);
jsonGenerator.writeObject(p);
jsonGenerator.writeEndArray();
jsonGenerator.flush();
jsonGenerator.close();
Log.d(TAG, stringWriter.toString());
}& & 思路是完全一样的,下面是测试的结果:
&span style=&font-size: 18&&[&zhaokaiqiang&,22,{&name&:&zhaokaiqiang&,&birthday&:{&day&:19,&month&:1,&year&:1992},&age&:22}]&/span&
3.解析简单Json对象
& & 下面开始介绍如何解析Json数据为Java对象。
& & 我们直接看解析代码
public void toObject() throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Person p = new Person(&zhaokaiqiang&, 22, new Birthday());
String jsonString = getJsonString(p);
Person person = objectMapper.readValue(jsonString, Person.class);
Log.d(TAG, person.toString());
& & 在解析的时候,我们还是需要用ObjectMapper对象,调用readValue,然后传入需要解析的json数据和转换类型的class,就可以完成转换了。
& & 下面是解析简单的集合对象的代码
public void toObjects() throws Exception {
Person p = new Person(&zhaokaiqiang&, 22, new Birthday());
ArrayList&Person& persons = new ArrayList&Person&();
persons.add(p);
persons.add(p);
persons.add(p);
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = getJsonString(persons);
@SuppressWarnings(&unchecked&)
ArrayList&Person& arrayList = objectMapper.readValue(jsonString,
new ArrayList&Person&().getClass());
Log.d(TAG, arrayList.toString());
4.解析复杂的Json对象
& & 这里所说的复杂对象,与上面的生成的复杂Json对象是一个意思,指不是由简单的基本类型或者是单一对象集合的Json对象。我们要进行解析测试的文本,是下面的这种形式
{&name&:&zhaokaiqiang&,&age&:22,&person&:{&name&:&zhaokaiqiang&,&birthday&:{&day&:19,&month&:1,&year&:1992},&age&:22}}
& & 这个字符串中有字符串类型、int类型、一个拥有对象属性的一个自定义的对象,所以使用上面的进行类型反射的做法是完不成解析操作的,因为这个对象比较复杂,所以经过研究,我决定采用分段的方式进行解析,也就是对于这种Object类型的Json数据,分别根据key取出value,然后单独对里面的自定义对象进行解析,下面我们看代码实现:
public void fromJsons() throws Exception {
String jsonString = createObjectJson();
ObjectMapper objectMapper = JacksonMapper.getInstance();
JsonNode jsonNode = objectMapper.readTree(jsonString);
JsonNode nameNode = jsonNode.get(&name&);
JsonNode ageNode = jsonNode.get(&age&);
JsonNode persoNode = jsonNode.get(&person&);
String personString = persoNode.toString();
Person person = objectMapper.readValue(personString, Person.class);
Log.d(TAG, &person=& + person.toString());
Log.d(TAG, &age=& + ageNode.asInt());
Log.d(TAG, &name=& + nameNode.asText());
& & 我们在这里使用了ObjectMapper的readTree方法,返回一个JsonNode对象,我们在这里采用的是树模型的解析方式,类似XML中的DOM。
& & 如果我们想获取基本数据类型的数据,那么我们使用JsonNode.get()根据key获取到包含了value的JsonNode对象之后,根据类型,使用as__()即可将需要获取的数据提取出来。JsonNode代表的是一个节点,是Json的树模型的一个基础类。
& & 但是如果想获取类型是非基础类型的数据的时候,JsonNode并没有提供对应的方法,所以我们只能使用JsonNode的toString方法,获取到Json格式的数据,然后根据我们前面介绍的解析简单对象的方法再次解析即可。但是有一个注意点,就是我们获取key为&person&的数据的时候,不能够使用JsonNode.asText()来获取,因为这并不是一个文本,而是一个Object形式的另外一个Json对象,这样做会获取不到的,所以我用的toString()获取。
& & 当然,这只是我自己探索出来的一个方法,还有其他的方案,比如直接创建这种类型的JavaBean,但是比较麻烦,上面的这种方法更加直观。
& & 到现在为止,Android平台下主流的三种Json解析方式已经介绍完毕,我们来总结一下:
(1)Android自带的Json类库,效率低,使用繁琐,不支持反射解析,不推荐使用
(2)google的Gson解析库,这个是我之前一直使用的类库,使用方便,资料比较多,效率对于小量的数据解析来说没有问题,也是很推荐大家使用
(3)jackson是效率最高的解析方案,如果数据量巨大,这个方案绝对是首选。如果数据量比较小,和Gson相比差别不是很大,自己哪个顺手用那个。
& & 除了上面介绍的Jackson,Jackson还有其他更强大的用法,这里就不一一介绍了,用到再说,下面是几个参考网址:
(1)Jackson在线文档:
(2)Jackson介绍的官网翻译:
(3)Jackson源码查看:
(4)在线Json验证:
& &文章中的测试Demo下载地址:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:34163次
排名:千里之外
转载:91篇
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'<div id="click_content_aid_
<div id="favrite_content_aid_
传统路由与智能路由的碰撞,网件R6220与极路由3对比评测
传统路由与智能路由的碰撞,网件R6220与极路由3对比评测
12:00&&|&&作者:
&&|&&关键字:,,
USB接口速率对比:网件R6220读写速度更快网件R6220和3均配置有一个USB
2.0接口,可用于扩展外置存储设备,可实现例如网络文件共享等功能。不过这些功能大多对USB接口速率有一定的要求,因此路由器能否提供高速率的USB接口,将直接影响其在网络存储功能上的表现。我们测试中使用的是东芝TransMemory-MX
32GB版闪存盘,同时考虑到无线网络本身就有速率上的波动,对路由器USB接口速率的测试成绩有较大的影响,因此我们使用网速相对稳定的有线网络连接路由器进行测试。首先我们来看看东芝TransMemory-MX 32GB版闪存盘在PC的USB
2.0接口上会有什么表现,从测试结果来看,其在USB 2.0接口上的连续读写速度为34MB/s和30MB/s,可以算是一款读写速度比较快的闪存盘。在网件R6220路由器的USB
2.0接口上,闪存盘跑出来的读写成绩分别为24MB/s和23MB/s,虽然比起PC上的测试成绩要低了接近三分之一,不过对比我们测试过的各种路由器产品,这个成绩其实也算是不错了,虽然作为NAS使用是有点慢,但用于临时性的文件分享也是足够了。然而在极路由3上,闪存盘的读写成绩却只剩下个位数,分别为6MB/s和7MB/s,我们随后也有尝试过使用百兆LAN接口进行测试,或者是更改闪存盘的分区格式等等,但是对其在极路由3上的读写速率都几乎没有任何影响。对于极路由3的USB
2.0接口读写速度较慢的情况,实际上是在我们预料之中的。有路由器平台解决方案有一定了解的玩家应该知道,联发科MT7620A平台面向的主要是高整合度的入门级平台,其综合性能其实并不算很强,只能算是“基本够用”,而且采用这套方案的路由器都有USB
2.0接口读写速度普遍偏低的情况,极路由3的成绩放在同一平台的产品中其实已经算是中上位置。但是在面对同价位的网件R6220时,极路由3的这个成绩显然要处于劣势,只能够说是“总比没有好”。
1.6.2.7.3.8.4.9.USB接口速率对比:网件R6220读写速度更快5.10.
本文读者还喜欢
有什么用?
Blade&编辑&:信号测试时R6220选择的是美国地区,100%功率
从性能而言R6220确实领先极路由,但是在官方系统方面,R6220在功能扩展上是不如极路由3的,需要依靠第三方固件
至于你说是的外观,我们手上的R6220是网件提供的评测样品,外观上可能会有些不同,但实际性能是一样的
小沙弥&高中生&:百分百功率下面还有一档超级功率,打开会有惊喜,我以为既然对比信号强度,应当调节到他最大当量来参赛才是
Blade&编辑&:不是我不打开,而是里面真没这个选项
这个有可能是因为测试中使用的是网件提供的固件有关,这个固件的版本比官网上提供下载的还要高一些
请问设在中国时就是wifi比较弱时过一墙时信号怎么样?我打算买这款网件的路由,极路由百兆WAN太坑爹了
不能,就一个百兆的WAN口已经可以打消这个想法了
这是黑还是
开迅雷的话,延迟不变的路由器估计都是600以上的,这货多少钱?直接把upnp关了,开dmz试试!低端路由器,开upnp,开迅雷,路由器没一会儿都直接死掉了!
3700V4,同样觉得网件的QOS真的没什么效果
游客:华为的路由我烧了3个了,我求长时间的满吞吐测试……,测温度,性能,丢包率之类的
游客:这个,我道个歉,
最后一个本来是华硕,
结果手一歪、、、
华为硬件不差,固件坑爹
游客:华为的路由我烧了3个了,我求长时间的满吞吐测试……,测温度,性能,丢包率之类的
这个,我道个歉,
最后一个本来是华硕,
结果手一歪、、、
谢谢提醒,已修改~
(你可匿名或登录后发表评论。没有帐号可,或使用和直接登录)
爱玩,爱吃,爱电脑,爱DIY,爱妹子,爱喵星人,自此一家绝无小号~
扫一扫右边的二维码
关注超能网微信账号
NVIDIA Max-Q笔记本导购
开学装机少不了,高性价比SSD导购
长续航、性能也够强的手机导购
暑假游戏笔记本导购摄影师跑的比运动员还快,这有点尴尬了
世界冠军都跑去当摄影师了
毒液是如何致命的
如何提高下载速度的高端技能
刚放生,就被车撞了
天然步枪收藏夹,还有润滑功能呢
所以不要总是贬低自己,全世界哪都有素质低的地方
这就是瞎子为什么这么多的原因
据说是国外警察配置的新玩意
真不是想撞你。只不过是帮你关下车门而已
印美元就是这么简单
酷炫的吐烟技能,你仿佛在逗我
十多人扶电线杆都被电到
发型好酷炫,要不要来一个请
五千米高空看到了圆形彩虹
广场舞都这么洋气,都开始跳鬼舞步了
有了这个椅子,隔壁老王再也不用躲在柜子里了
雾霾抵京,有没有美国大片的感觉
剁了头还这么活跃,好吓人
这个露脸方式超越了我的想象
投影喷泉好酷炫
这小哥可以为黑人牙膏代言了
司机看到会吓傻了吧
孩子:我是谁,我在那,我要干什么?
当抢包贼遇到女侠入
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 神武手游70鞋子满速度 的文章

 

随机推荐