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);
}
}
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确实非常快。
需要说明的是,上面的测试是在如下版本进行的。