Json实践(一):fastjson和gson简单效率测试

1 篇文章 0 订阅

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

一、Json简介

1.1 JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。
数据在键值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
JSON 名称/值对
JSON 数据的书写格式是:名称/值对。名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:
"firstName":"John"
这很容易理解,等价于这条 JavaScript 语句:
firstName="John"

1.2  JSON 值

JSON 值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号中)
对象(在花括号中)

1.3 基础结构编辑

json的两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言 中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型 可以是 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样, 使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。


二、 gson和 fastJson

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。

FastJson是阿里巴巴提供的一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最 快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。功能强大,完全支持Java Bean、集合、Map、日 期、Enum,支持范型,支持自省;无依赖,能够直接运行在Java SE 5.0以上版本;支持Android;开源 (Apache 2.0)

下面简单进行两种框架的不严谨测试,  测试都需要用到实体类。

2.1代码如下:

实体类如下

package com.cwqsolo.entity.host;

public class HostInfo {
    
    public HostInfo() {
	this.Name = "";
	this.Ip="";
    }
    
    public HostInfo(String Name, String Ip) {
	this.Name = Name;
	this.Ip=Ip;
    }
    
    String Name ="";
    String Ip="";
    
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }
    public String getIp() {
        return Ip;
    }
 
}

下面看一下fastjson的测试代码

package com.cwqsolo.fastjson.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.cwqsolo.entity.host.HostInfo;


public class fastJsonDemo {

  public static void main(String[] args) {
	String json = "{\"hostname\":\"host-2\",\"ip\":\"192.168.136.134\"}";
	String arrayAyy = "[[\'host-3','192.168.136.144'],null,[\'host-4','192.168.136.154']]";
	int testNum = 1000000;

	System.out.println(" ------------ ");
	long start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Entity2json("host-1", "192.168.136.1");
	long end = System.currentTimeMillis();
	System.out.println("实体转换成json," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");

	System.out.println("");
	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    list2Json();
	end = System.currentTimeMillis();
	System.out.println("List转换成json," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Complexdata();
	end = System.currentTimeMillis();
	System.out.println("复杂对象转换成json," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Deserialization(json);
	end = System.currentTimeMillis();
	System.out.println("json 序列化," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Json2Eetity(json);
	end = System.currentTimeMillis();
	System.out.println("json转换为实体," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    String2JSONArray(arrayAyy);
	end = System.currentTimeMillis();
	System.out.println("字符串转换为json数组," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

    }

    // 实体转为Json
  public static void Entity2json(String Name, String Ip) {
	HostInfo info = new HostInfo(Name, Ip);
	String str_json = JSON.toJSONString(info); //

    }

    // list转Json
    public static void list2Json() {
	List<HostInfo> list = new ArrayList<HostInfo>();
	HostInfo host8 = new HostInfo("host-8", "192.168.136.158");
	HostInfo host9 = new HostInfo("host-9", "192.168.136.159");
	list.add(host8);
	list.add(host9);
	String json = JSON.toJSONString(list, true);

    }

    // 字符数组转化为JSon
    private static void String2JSONArray(String arrayAyy) {
	JSONArray array = JSONArray.parseArray(arrayAyy);

	Collection nuCon = new Vector();
	nuCon.add(null);
	array.removeAll(nuCon);

    }

    // 复杂数据类型
    public static void Complexdata() {
	HashMap<String, Object> map = new HashMap<String, Object>();
	map.put("name", "张三");
	map.put("age", 24);
	map.put("phone", "13799313810");

	// map集合
	HashMap<String, Object> temp = new HashMap<String, Object>();
	temp.put("name", "李四");
	temp.put("age", "23");
	map.put("girlInfo", temp);

	// list集合
	List<String> list = new ArrayList<String>();
	list.add("编码");
	list.add("测试");
	list.add("需求");
	map.put("hobby", list);
	String jsonString = JSON.toJSONString(map);

    }


    // 复杂数据类型
  public static void Deserialization(String json) {
		HostInfo host1 = JSON.parseObject(json, HostInfo.class);

    }

    // Json转为实体
    private static void Json2Eetity(String json) {
			HostInfo host1 = JSON.parseObject(json, HostInfo.class);
    }
}


完成同样的功能,我们看一下gson的代码如下:

package com.cwqsolo.gson.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;

import com.cwqsolo.entity.host.HostInfo;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;

public class gsonDemo {
    static  Gson gson = new Gson();

    public static void main(String[] args) {
	gsonDemo myObj = new gsonDemo();
	
	String json = "{\"hostname\":\"host-2\",\"ip\":\"192.168.136.134\"}";
	String arrayAyy = "[[\'host-3','192.168.136.144'],null,[\'host-4','192.168.136.154']]";
	int testNum = 1000000;

	System.out.println(" ------------ ");
	long start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Entity2json("host-1", "192.168.136.1");
	long end = System.currentTimeMillis();
	System.out.println("实体转换成json," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");

	System.out.println("");
	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    list2Json();
	end = System.currentTimeMillis();
	System.out.println("List转换成json," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Complexdata();
	end = System.currentTimeMillis();
	System.out.println("复杂对象转换成json," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Deserialization(json);
	end = System.currentTimeMillis();
	System.out.println("json 序列化," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    Json2Eetity(json);
	end = System.currentTimeMillis();
	System.out.println("json转换为实体," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

	System.out.println(" ------------ ");
	start = System.currentTimeMillis();
	for (int i = 0; i < testNum; i++)
	    String2JSONArray(arrayAyy);
	end = System.currentTimeMillis();
	System.out.println("字符串转换为json数组," + testNum + "次耗时: "
		+ ((end - start) / 1000.0) + " seconds");
	System.out.println("");

    }

    // 实体转为Json
    public static void Entity2json(String Name, String Ip) {
	HostInfo info = new HostInfo(Name, Ip);
	String str_json = gson.toJson(info); //

    }

    // list转Json
    public static void list2Json() {
	List<HostInfo> list = new ArrayList<HostInfo>();
	HostInfo host8 = new HostInfo("host-8", "192.168.136.158");
	HostInfo host9 = new HostInfo("host-9", "192.168.136.159");
	list.add(host8);
	list.add(host9);
	String json = gson.toJson(list);

    }

    // 字符数组转化为JSon
    private static void String2JSONArray(String arrayAyy) {

	JsonArray jsonArray = new JsonParser().parse(arrayAyy).getAsJsonArray();

	Collection nuCon = new Vector();
	nuCon.add(null);
	jsonArray.remove(jsonArray);

    }

    // 复杂数据类型
    public static void Complexdata() {
	HashMap<String, Object> map = new HashMap<String, Object>();
	map.put("name", "张三");
	map.put("age", 24);
	map.put("phone", "13799313810");

	// map集合
	HashMap<String, Object> temp = new HashMap<String, Object>();
	temp.put("name", "李四");
	temp.put("age", "23");
	map.put("girlInfo", temp);

	// list集合
	List<String> list = new ArrayList<String>();
	list.add("编码");
	list.add("测试");
	list.add("需求");
	map.put("hobby", list);

	String jsonString = gson.toJson(map);

    }

    // 复杂数据类型
    public static void Deserialization(String json) {

	HostInfo host1 = gson.fromJson(json, HostInfo.class);

    }


    // Json转为实体
    private static void Json2Eetity(String json) {

	HostInfo host1 = gson.fromJson(json, HostInfo.class);

    }
}

2.2 测试结果

简单的说,就是使用这两种json的工具包,我们测试这些工具包,执行N次的时间效率。下面是2种json框架的执行结果。

先贴一下fastjson的执行结果:

 ------------ 
实体转换成json,1000000次耗时: 1.195 seconds

 ------------ 
List转换成json,1000000次耗时: 2.111 seconds

 ------------ 
复杂对象转换成json,1000000次耗时: 3.315 seconds

 ------------ 
json 序列化,1000000次耗时: 1.492 seconds

 ------------ 
json转换为实体,1000000次耗时: 0.947 seconds

 ------------ 
字符串转换为json数组,1000000次耗时: 1.404 seconds

再来看一下gson的执行结果

 ------------ 
实体转换成json,1000000次耗时: 1.836 seconds

 ------------ 
List转换成json,1000000次耗时: 3.235 seconds

 ------------ 
复杂对象转换成json,1000000次耗时: 4.587 seconds

 ------------ 
json 序列化,1000000次耗时: 1.812 seconds

 ------------ 
json转换为实体,1000000次耗时: 1.385 seconds

 ------------ 
字符串转换为json数组,1000000次耗时: 2.212 seconds

从上面的结果看,fastjson确实非常快。

需要说明的是,上面的测试是在如下版本进行的。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值