JSON 解析 (三)—— FastJSON与Jackson比较
一、方便性与性能
调用方便性而言:
- FastJSON提供了大量静态方法,调用简洁方便
- Jackson须实例化类,调用相对繁琐,可通过封装成JSON工具类简化调用
性能而言:
- FastJSON反序列化的性能略差,对于256k的json字符串,平均700ms
- Jackson 的 data binding反序列化的性能稍好,对于256k的json字符串,平均600ms
- 两者的序列化性能基本相同,对于256k的json字符串,平均140ms
- 相对data binding方式(ObjectMapper.writeValueAsString()),Jackson的流输出方式(JsonGenerator.writeObject())性能稍好,平均130ms
二、其他
1、序列化与反序列化的实现细节
对象在序列化时,通过反射,遍历getter方法(getXXX(),isXXX),从方法名中获取属性名(XXX),并调用getter方法获取属性值,组合在一起,从而完成序列化;在反序列化时,遍历属性名(XXX)并拼接成setter方法(setXXX), 通过反射,查询并调用setter方法,从而完成对象构建。 序列化与反序列化的实现,与具体字段无直接关联,示例如下:
public class Product {
private String name;
private Double price;
// private boolean sold; public boolean isSold() {
return true;
} // name、price的getter、setter方法
...
}
@Test
public void testBoolPOJO() { Product product = new Product();
product.setName("hello");
product.setPrice(12.36); String json = JSON.toJSONString(product);
System.out.println(json);
// {"name":"hello","price":12.36,"sold":true} Product product2 = JSON.parseObject(json, Product.class);
System.out.println(product2.getName() + " " + product2.getPrice());
// hello 12.36
}
如上所示,sold字段不存在,但在序列化时,可依据getter方法,在结果中生成该字段;在反序列化时,依据setter方法,上例即便存在sold字段(去掉该字段注释),由于不存在该字段的setter方法,无法从json字符串中获取到该属性值。
《阿里巴巴Java编程规约》指出,在POJO类中,对布尔类型的变量,都不要加 is 前缀,如:定义为基本数据类型 Boolean isDeleted 的属性,它的方法是 isDeleted()、setIsDeleted(),在反向解析的时候,反序列化工具“误以为”对应的属性名称是 deleted,尝试调用setDeleted(),由于方法不存在,获取不到属性,可能抛出异常(如Jackson)
2、FastJSON与Jackson在反序列化时的细微差异
a、在反序列化时,默认情况下,如果根据Json字符串中的属性,在实体类中找不到对应的setter方法,FastJSON会忽略该属性,而Jackson会报错
测试Product实体如上
@Test
public void testBoolPOJO2() throws Exception {
Product product = new Product();
product.setName("hello");
product.setPrice(12.36); ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String json = objectMapper.writeValueAsString(product);
System.out.println(json); Product product2 = objectMapper.readValue(json, Product.class); // 报错
System.out.println(product2.getName() + " " + product2.getPrice());
}
通过配置DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES为fasle,可忽略多出的属性
spring mvc使用的MappingJackson2HttpMessageConverter,在设置ObjectMapper的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES时,在spring 3中为true,在spring 4及之后为false,因此,请求的json实体可包含冗余字段。
详细可参考:关于jackson的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
b、反序列化时,若找不到属性setter方面,Jackson会进一步查找同名字段,FastJSON则直接忽略
public class Product {
private String name;
private Double price;
private boolean sold; public boolean isSold() {
return this.sold;
} // name、price的getter、setter方法
...
}
@Test
public void testBoolPOJO3() throws Exception {
String json = "{\"name\":\"hello\",\"price\":12.36,\"sold\":true}"; ObjectMapper objectMapper = new ObjectMapper();
Product product1 = objectMapper.readValue(json, Product.class);
System.out.println(product1.isSold()); // true Product product2 = JSON.parseObject(json, Product.class);
System.out.println(product2.isSold()); // false
}
参考:
关于jackson的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
JSON 解析 (三)—— FastJSON与Jackson比较的更多相关文章
- Android总结之json解析(FastJson Gson 对比)[申明:来源于网络]
Android总结之json解析(FastJson Gson 对比)[申明:来源于网络] 地址:http://blog.csdn.net/u014031072/article/details/5392 ...
- [转] 各种Json解析工具比较 - json-lib/Jackson/Gson/FastJson
JSON技术的调研报告 一 .各个JSON技术的简介和优劣1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括com ...
- Json 工具介绍 fastjson gson jackson
1. fastjson fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致, 是目前Java语言中最快的J ...
- 75、JSON 解析库---FastJson, Gson
JSON 的简介: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.用于数据转换传输, 通用于PHP,Java,C++,C#,Python等编程语言数据交 ...
- Android总结之json解析(FastJson Gson 对比)
前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...
- 来自阿里的 json 解析方案 fastjson
说起Json 解析,有非常多方法,不管是出自Google 的Gson也好,还是来自其它的某某.想必大家都非常熟悉. 今日在github上闲逛.偶遇 一 json 解析库.看起来非常不错,据说是眼下最快 ...
- JSON 解析 (二)—— Jackson的使用
Jackson是基于Java语言的一种JSON和Java对象的数据处理工具.功能上简单易用,性能上根据目前主流转换工具比较,Jackson相对比较高效. <dependency> < ...
- Java的Json解析包FastJson使用
阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser. ...
- Android 中的Json解析工具fastjson 、序列化、反序列化
Android中通常需要访问服务器,然而服务器返回的数据很多时候都是Json格式 1.fastjson简介 阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备 ...
- 阿里的Json解析包FastJson使用
阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征: 速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser ...
随机推荐
- Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务
首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...
- 性能调优8:分组聚合 - group by
聚合实际上对数据做分组统计,SQL Server使用两种操作符来实现聚合,流聚合(Stream Aggregation)和哈希聚合(Hash aggration).流聚合是非阻塞性的,具有流的特性,流 ...
- 朱晔的互联网架构实践心得S1E10:数据的权衡和折腾【系列完】
朱晔的互联网架构实践心得S1E10:数据的权衡和折腾[系列完] [下载本文PDF进行阅读] 本文站在数据的维度谈一下在架构设计中的一些方案对数据的权衡以及数据流转过程中的折腾这两个事情.最后进行系列文 ...
- .net Core 调用微信Jsapi接口,H5解析二维码
项目里需要用到扫描二维码,自己实现,不会. 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库.如果二维码比较清晰,用这种效果也不错 调用微信扫一扫功能,这种效果很好 ...
- 有界算子p129
? 如果我把这里的1改成2,把1/(a-b) 换成1/2(a-b) 为什么不能是? 2. 这里的x是关于t的函数,为什么x属于 结果了?和x应该没有关系呀? 3. 那为什么T的范数不是一个固定值?为什 ...
- MySQL左连接时 返回的记录条数 比 左边表 数量多
在学MySQL的连接时,为了便于记忆,就将左连接 记做 最后结果的总记录数 和 进行左连接的左表的记录数相同,简单的说就是下面这个公式 count(table A left join table B) ...
- Ubuntu18.04更新源
一.备份/etc/apt/sources.list文件 cd /etc/apt sudo cp sources.list sources.list.old 二.选择国内常用的源 #阿里源 deb ht ...
- 容错处理try
var num = 90; try{ console.log( num + 100 ); consolel.log(aaa); }catch(e){ console.log("如果程序中有异 ...
- mybatis出现NoSuchMethodException异常
今天在idea中调试项目(ssm搭建的项目)的时候,mybatis突然出现了NoSuchMethodException异常,具体的异常时: java.lang.NoSuchMethodExceptio ...
- [转帖] BMC安全隐患
BMC再现漏洞,裸金属云服务器岌岌可危 https://zhuanlan.kanxue.com/article-8006.htm 之前有vt-x 可能有隐患 现在看起来BMC 也就是IPMI 也有隐患 ...