首先分析下目前号称最快的FastJson,这个是所有人都验证过的,解析速度确实比较快,不过也需要根据数据量来看,数据量小的时候,Gson性能要稍微优于FastJson,但在数据量大解析的情况下,FastJson的速度就要明显快于Gson。具体原因,我没研究过,只是做过测试,确实是这样。

性能测试代码如下:

/** * 测试Bean类 */
public class TestBean {
private String name;
private int age;
private String no; public TestBean() {
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int j) {
this.age = j;
} public String getNo() {
return no;
} public void setNo(String no) {
this.no = no;
} }
/** * 比较FastJson和Gson的效率 */
public void comparedFastJsonAndGson() {
List<TestBean> list = new ArrayList<>();
int j = 0;
TestBean u = null;
//数据生成
while (j < 1000000) {
u = new TestBean();
u.setAge(j);
u.setName("zhangsan " + j);
u.setNo("" + j);
list.add(u);
j++;
}
//做测试时,两个方法不要同时使用,注释掉另一个分别运行,然后再比较时间,不然结果不准
// FastJson性能测试
fastJsonTest(list);
System.out.println("!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// Gson性能测试
gsonTest(list);
} /** * FastJsonTest * * @param list */
private void fastJsonTest(List<TestBean> list) {
long s = System.currentTimeMillis();
System.out.println("before alibaba:" + s);
String aliJson = com.alibaba.fastjson.JSON.toJSONString(list);
long e = System.currentTimeMillis();
System.out.println("after alibaba:" + e);
System.out.println("beanToJson:" + (e - s));
list = null;
long s3 = System.currentTimeMillis();
List<TestBean> sult = JSON.parseArray(aliJson, TestBean.class);
// List<U> sult = (List<U>) JSONObject.parse(aliJson);
long e3 = System.currentTimeMillis();
System.out.println("JsonTobean:" + (e3 - s3));
} /** * GsonTest * * @param list */
private void gsonTest(List<TestBean> list) {
long s1 = System.currentTimeMillis();
System.out.println("before Gson:" + s1);
Gson gson = new Gson();
String gsonStr = gson.toJson(list);
long e1 = System.currentTimeMillis();
System.out.println("after Gson:" + e1);
System.out.println("beanToJson:" + (e1 - s1));
list = null;
long s4 = System.currentTimeMillis();
// type 获取List<U>类型的class
Type type = new TypeToken<List<TestBean>>() {
}.getType();
List<TestBean> sult2 = gson.fromJson(gsonStr, type);
long e4 = System.currentTimeMillis();
System.out.println("JsonTobean:" + (e4 - s4));
}

下面介绍下两种解析方式的具体使用方法(这里使用的是K780数据网的5~7天天气预报信息)

/** * @author Jerry 2016.4.15 * */
public class Weather {
private String days; // 日期
private String week; // 星期
private String citynm; // 城市/地区
private String temperature;// 温度
private String weather; // 天气
private String wind;// 风向
private String winp;// 风力 public Weather() {
} public String getDays() {
return days;
} public void setDays(String days) {
this.days = days;
} public String getWeek() {
return week;
} public void setWeek(String week) {
this.week = week;
} public String getCitynm() {
return citynm;
} public void setCitynm(String citynm) {
this.citynm = citynm;
} public String getTemperature() {
return temperature;
} public void setTemperature(String temperature) {
this.temperature = temperature;
} public String getWeather() {
return weather;
} public void setWeather(String weather) {
this.weather = weather;
} public String getWind() {
return wind;
} public void setWind(String wind) {
this.wind = wind;
} public String getWinp() {
return winp;
} public void setWinp(String winp) {
this.winp = winp;
} @Override
public String toString() {
return "Weather [days=" + days + ", week=" + week + ", citynm=" + citynm + ", temperature=" + temperature
+ ", weather=" + weather + ", wind=" + wind + ", winp=" + winp + "]";
}
}
/** * @author Jerry */
public class WeatherGson {
private String success;
private List<Weather> result; // 此处List 名字,必须为Json数组中键的名字,必须相同 public WeatherGson() {
} public WeatherGson(String success, List<Weather> result) {
this.success = success;
this.result = result;
} public String getSuccess() {
return success;
} public void setSuccess(String success) {
this.success = success;
} public List<Weather> getList() {
return result;
} public void setList(List<Weather> list) {
this.result = list;
} @Override
public String toString() {
return "WeatherJson [success=" + success + ", list=" + result + "]";
}
}

以下所以方法都卸载JsonDemo类中

/** * 获取网络Json数据String * * @param weaid * @return */
public String getJsonData() {
System.out.println("请等待..."); String url = "http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
//将获取到的数据转换成字符串,此处是我自己封装的工具类
String jsonData = HttpUitls.doPostToString(url, "utf-8");
return jsonData;
}

首先是FastJson的解析:

/** * fastJson 解析 * * @param jsonData * @return */
public List<Weather> fastJsonParser(String jsonData) {
// 获取jsonObject对象
JSONObject object = JSON.parseObject(jsonData);
String success = object.getString("success");
if ("1".equals(success)) {
// 从jsonObject对象中获取 result 对象的值(Json数组)
String result = object.getString("result");
// 将Json数组转换成List集合
List<Weather> list = JSON.parseArray(result, Weather.class);
return list;
} else {
throw new RuntimeException("获取信息失败:" + success);
}
}

接着是Gson的解析:

/** * Gson 解析 * * @param jsonData */
public List<Weather> gsonParser(String jsonData) {
Gson gson = new Gson();
System.out.println(jsonData);
// List<Weather> list2 = gson.fromJson(jsonData, new
// TypeToken<List<Weather>>(){}.getType());
WeatherGson fromJson = gson.fromJson(jsonData, WeatherGson.class);
if ("1".equals(fromJson.getSuccess())) {
return fromJson.getList();
} else {
throw new RuntimeException("获取信息失败:" + fromJson.getSuccess());
}
}

最后是Json解析:

/** * Json解析 * * @param jsonData * @return */
public List<Weather> jsonParser(String jsonData) {
list = new ArrayList<>();
try {
org.json.JSONObject object = new org.json.JSONObject(jsonData);
JSONArray result = object.getJSONArray("result");
for (int i = 0; i < result.length(); i++) {
org.json.JSONObject object2 = result.getJSONObject(i);
this.weather = new Weather();
String days = object2.getString("days");
String week = object2.getString("week");
String citynm = object2.getString("citynm");
String temperature = object2.getString("temperature");
String weather = object2.getString("weather");
String wind = object2.getString("wind");
String winp = object2.getString("winp");
this.weather.setDays(days);
this.weather.setWeek(week);
this.weather.setCitynm(citynm);
this.weather.setTemperature(temperature);
this.weather.setWeather(weather);
this.weather.setWind(wind);
this.weather.setWinp(winp);
list.add(this.weather);
}
return list;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}

Main:

public class Main {

    public static void main(String[] args) {
JsonDemo jsonDemo = new JsonDemo();
// 比较FastJson和Gson 的效率
jsonDemo.comparedFastJsonAndGson(); // 从网络获取Json数据
String jsonData = jsonDemo.getJsonData(); // 使用Json获取数据集合
List<Weather> list = jsonDemo.jsonParser(jsonData);
for (Weather weather : list) {
System.out.println(weather);
} // 使用FastJson 获取数据集合
List<Weather> list2 = jsonDemo.fastJsonParser(jsonData);
for (Weather weather : list2) {
System.out.println(weather);
} // 使用Gson 获取数据集合
List<Weather> list3 = jsonDemo.gsonParser(jsonData);
for (Weather weather : list3) {
System.out.println(weather);
}
}
} from: http://www.voidcn.com/blog/ming2316780/article/p-5811077.html

FastJson和Gson和Json数据解析分析和用法的更多相关文章

  1. 使用Gson轻松解决复杂结构的Json数据解析

    转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50961803 JSON简介 JSON(JavaScript Object Notati ...

  2. JSON数据解析(GSON方式) (转)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 在上一篇博文<Andro ...

  3. Android JSON数据解析(GSON方式)

    要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Jav ...

  4. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  5. 最简单简洁高效的Json数据解析

    一.无图无真相 二.主要代码 1.导入jar包 拷贝fastjson.jar包到projectlibs包下 2.封装工具类JsonUtil.java package com.example.parse ...

  6. 多叉树结构:JSON数据解析(二)

    多叉树结构:JSON数据解析(二) 在上篇文章中提到了JSON数据解析的基本方法,但是方法效率太低,这里接着上篇文章写写如何利用多叉树结构,定义对象,实现JSON数据字段快速随机访问. JSON数据通 ...

  7. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 场景模拟 假设由于漏存JD SKU对应的店铺信息.这时我们需要重新完全采集所有 ...

  8. JSON数据解析(转)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...

  9. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 场景模拟 接上一篇, JD SKU对应的店铺信息是异步加载 ...

随机推荐

  1. Linux 的软件安装目录

    Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32. / ...

  2. loadrunner——常见函数

    loadrunner——常见函数 分类: LoadRunner 2012-04-11 20:41 703人阅读 评论(0) 收藏 举报 loadrunnersearchweb服务器脚本stringwe ...

  3. 关于linux时间

    时区确定cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 查看硬件时间hwclock --show 将系统时间写入硬件时间hwclock --sy ...

  4. MVC设计模式一

    一:基础知识 1.mvc model view control 2.模型 是应用程序的主体部分,模型表示业务数据与业务逻辑. 一个模型可以为多个视图提供数据 提高了代码的可重用性 3.视图 用户看到的 ...

  5. MongoDB入门教程一[文档与集合]

    MongoDB 是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同.举个例子,在关系型数据库中,我们记录一个订单的信息,通常是这样设计表结构的: 设计一个订单基本信息表和一个订 ...

  6. 【基础知识】C#数据库中主键类型的选择

    主键在数据库中占有很大的地位,对于表的关联性,和数据的唯一识别性有重要的作用: 1,在C#开发中,Int自增字段和Guid(数据库中是uniqueidentifier类型)可设置为主键: 1>G ...

  7. 【拉格朗日插值法】【找规律】【高精度】Gym - 101156G - Non-Attacking Queens

    题意:问你n*n的国际象棋棋盘上放3个互不攻击皇后的方案数. oeis……公式见代码内 //a(n) = 5a(n - 1) - 8a(n - 2) + 14a(n - 4) - 14a(n - 5) ...

  8. 80X86指令总结

    一.数据传送指令 指令名称 汇编语句格式 功能 影响标志位 传送move data mov opd, ops (ops) → opd:分为主存储器.通用寄存器.段寄存器,不可同时使用主存储器,类型要匹 ...

  9. Android 打包出现jdk版本错误的问题

    Android 打包出现 jdk 版本错误的问题,本质上是 SDK 的问题,与 JDK 无关.如果 SDK 的 API 是24或者更高,就要求 jdk 1.8,我这里指定的 API 是22,所以去勾选 ...

  10. bzoj 3275 最小割

    给你一堆东西,叫你选一些东西出来,使得价值最大,要求选出的东西集合中的任意a,b满足性质p. 可以考虑: 1.拟阵? 2.二分图? 这道题由于数学硬伤,不知道不存在两条直角边是奇数,斜边是整数的直角三 ...