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

来源:互联网 发布:网络批发平台有哪些 编辑:程序博客网 时间:2024/05/22 12:21

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确实非常快。

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








0 0
原创粉丝点击