发表于: 2017-10-06 22:26:51
0 748
今天完成的事情:JSON所有技术了解,简单性能对比
一 、各个JSON技术的简介和优劣
1.json-lib
json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,
包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,
对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。
json-lib在功能和性能上面都不能满足现在互联网化的需求。
2.Jackson
相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。
而且Jackson社区相对比较活跃,更新速度也比较快。
Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
3.Gson
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
4.FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
综上4种Json技术的比较,在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,
如果只是功能要求,没有性能要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean
二、代码实战
maven依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.1</version>
</dependency>
<!--gjson-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<!--json-lib-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
实体类Book
import java.io.Serializable;
import java.util.Date;
public class Book implements Serializable{
private Integer id;
private String name;
private Double price;
private boolean publish;
private Date createDate;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", publish=" + publish +
", createDate=" + createDate +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public boolean isPublish() {
return publish;
}
public void setPublish(boolean publish) {
this.publish = publish;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
工具类DateUtil
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
public static String getTime(){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S ");
return format.format(new Date());
}
public static String getformat(Date date){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S ");
return format.format(date);
}
public static String totalTime(Date old){
Date now = new Date();
return getformat(new Date(now.getTime()-old.getTime()));
}
}
测试类
Fastjson测试类
public class FastJsonTest {
public static void main(String[] args){
Book book = new Book();
book.setId(1);
book.setName("aa");
book.setPrice(22.1);
book.setPublish(false);
book.setCreateDate(new Date());
String str = "{\"createDate\":1498616533082,\"id\":1,\"name\":\"aa\",\"price\":22.1,\"publish\":false}";
long times = Common.TEST_TIMES;
//logTime();
for (int i =0;i<12;i++){
Date date = new Date();
deserialize(str,times);
//serialize(book,times);
logTime(DateUtil.totalTime(date));
}
}
public static void logTime(){
System.out.println(DateUtil.getTime());
}
public static void logTime(Object obj){
System.out.println(obj);
}
/**
* 序列化
*/
public static void serialize(Object obj,long times){
//每次迭代为其分配地址
for (int i=0;i<times;i++){
String out = JSON.toJSONString(obj).toString();
}
}
/**
* 反序列化
*/
public static void deserialize(String str,long times){
for (int i=0;i<times;i++){
Book book = JSON.parseObject(str,Book.class);
}
}
}
Gson测试类
public class GsonTest {
public static void main(String[] args){
Book book = new Book();
book.setId(1);
book.setName("aa");
book.setPrice(22.1);
book.setPublish(false);
book.setCreateDate(new Date());
String str = "{\"createDate\":1498616533082,\"id\":1,\"name\":\"aa\",\"price\":22.1,\"publish\":false}";
long times = Common.TEST_TIMES;
Gson gson = new Gson();
for (int i =0;i<12;i++){
Date date = new Date();
serialize(gson,book,times);
logTime(DateUtil.totalTime(date));
}
// deserialize(gson,str,times);
}
public static void logTime(Object obj){
System.out.println(obj);
}
/**
* 序列化
*/
public static void serialize(Gson gson,Object obj,long times){
//每次迭代为其分配地址
try{
for (int i=0;i<times;i++) {
String out = gson.toJson(obj);
}
}catch (JsonSyntaxException e){
e.printStackTrace();
}
}
/**
* 反序列化
*/
public static void deserialize(Gson gson,String str,long times){
for (int i=0;i<times;i++){
Book book = gson.fromJson(str,Book.class);
}
}
}
Jackson测试类
public class JacksonTest {
public static void main(String[] args){
Book book = new Book();
book.setId(1);
book.setName("aa");
book.setPrice(22.1);
book.setPublish(false);
book.setCreateDate(new Date());
String str = "{\"createDate\":1498616533082,\"id\":1,\"name\":\"aa\",\"price\":22.1,\"publish\":false}";
long times = Common.TEST_TIMES;
ObjectMapper objectMapper =new ObjectMapper();
for (int i =0;i<12;i++){
Date date = new Date();
serialize(objectMapper,book,times);
logTime(DateUtil.totalTime(date));
}
// deserialize(objectMapper,str,times);
}
public static void logTime(Object obj){
System.out.println(obj);
}
/**
* 序列化
*/
public static void serialize(ObjectMapper objectMapper,Object obj,long times){
//每次迭代为其分配地址
try{
for (int i=0;i<times;i++) {
String out = objectMapper.writeValueAsString(obj);
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 反序列化
*/
public static void deserialize(ObjectMapper objectMapper,String str,long times){
try{
for (int i=0;i<times;i++){
Book book = objectMapper.readValue(str,Book.class);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
Jsonlib测试类
public class JsonlibTest {
public static void main(String[] args){
Book book = new Book();
book.setId(1);
book.setName("aa");
book.setPrice(22.1);
book.setPublish(false);
book.setCreateDate(new Date());
String str = "{\"createDate\":1498616533082,\"id\":1,\"name\":\"aa\",\"price\":22.1,\"publish\":false}";
long times = Common.TEST_TIMES;
//logTime();
for (int i =0;i<12;i++){
Date date = new Date();
serialize(book,times);
logTime(DateUtil.totalTime(date));
//logTime();
}
//deserialize(str,times);
//logTime();
}
public static void logTime(){
System.out.println(DateUtil.getTime());
}
public static void logTime(Object obj){
System.out.println(obj);
}
/**
* 序列化
*/
public static void serialize(Object obj,long times){
//每次迭代为其分配地址
for (int i=0;i<times;i++){
String out = JSONObject.fromObject(obj).toString();
}
}
/**
* 反序列化
*/
/*public static void deserialize(String str,long times){
for (int i=0;i<times;i++){
Book book = (Book)JSONObject.toBean(str,Book.class);
}
}*/
}
明天计划的事情:拆分禅道,开工
遇到的问题:昨晚听王蒙他们评审,老大后来说让他们先开始动工拆禅道代码生成了,说评到现在这个样子,后面你都可以自己改了,叫他们先动工。
收获:json工具
评论