一:用于测试的类

User类

import lombok.Data;
import lombok.experimental.Accessors; /**
* @author silentdoer
* @version 1.0
*/
@Data
@Accessors(chain = true)
public class User {
private String name;
private String gender;
}

AppResult类

import lombok.Data;
import lombok.experimental.Accessors; /**
* @author silentdoer
* @version 1.0
*/
@Data
@Accessors(chain = true)
public class AppResult<T> {
private int code;
private T data;
}

二:Fastjson测试代码

String str = "{\"code\":100,\"data\":{\"gender\":\"男\",\"name\":\"中文\"}}";
AppResult<User> o = JSON.parseObject("{\"code\":100,\"data\":{\"gender\":\"男\",\"name\":\"中文\"}}", AppResult.class);
System.out.println(o);
System.out.println(o.getData().getClass()); // flag

在flag行会报java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to User

原因:因为Java的泛型擦除机制,无法像C#一样使用类似AppResult<User>.class,而AppResult.class中的T虽然在字节码里也叫T,但是会被jvm认为是Object的任意子类;

结论:Fastjson检测到要转换的类型是泛型时将会把那部分JSON字符串转换为fastjson的JSONObject对象赋值给data,因此这里报转换错误

三:Gson测试代码

Gson gson = new Gson();
AppResult<User> appResult = gson.fromJson(str, AppResult.class);
System.out.println(appResult);
System.out.println(appResult.getData().getClass());

也是报异常:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to User

结论:Gson如果检测到要反序列化的对象类型是泛型,那么将用一个gson自己的LinkedTreeMap来存储

四:对于Jackson也是一样

五:实现泛型的转换方式

1.对于Fastjson或Gson都是可以有个TypeToken一样的东西,不过这里用个更简单的方法:

Fastjson:

AppResult<User> o = JSON.parseObject("{\"code\":100,\"data\":{\"gender\":\"男\",\"name\":\"中文\"}}", new AppResult<User>(){}.getClass());

Gson:Gson似乎不行,只能用TypeToken来实现;

Fastjson可以的原理,其实就是因为泛型类虽然无法保留泛型的具体类型,但是其子类在具体化泛型后是可以保留的,因此new一个泛型类的空实现的子类,然后getClass()即可;

Fastjson和Gson零碎总结的更多相关文章

  1. FastJSON、Gson和Jackson性能对比

    Java处理JSON数据有三个比较流行的类库FastJSON.Gson和Jackson.本文将测试这三个类库在JSON序列化和反序列化的方面表现,主要测试JSON序列化和反序列化的速度.为了防止由于内 ...

  2. FastJson和Gson和Json数据解析分析和用法

    首先分析下目前号称最快的FastJson,这个是所有人都验证过的,解析速度确实比较快,不过也需要根据数据量来看,数据量小的时候,Gson性能要稍微优于FastJson,但在数据量大解析的情况下,Fas ...

  3. FastJSON、Gson、Jackson(简单了解使用)

    下载地址(maven) Jackson:http://mvnrepository.com/search?q=jackson FastJson:http://mvnrepository.com/sear ...

  4. json工具包比较 fastjson jackson gson

    对json进行json-object进行相互转化时,笔者接触到三种工具jar,现对其进行比较. fastjson:速度最快,阿里巴巴开源. jackson:springMvc 默认使用. gson:谷 ...

  5. FastJson与Gson小测试

    最近用到Json来传输数据,找到两个比较简单的工具 Gson 和 FastJson随便测试一下两个工具的效率~ 1 package com.json.fast; import java.util.Ar ...

  6. Android进阶笔记17:3种JSON解析工具(org.json、fastjson、gson)

    一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...

  7. 使用fastjson,gson解析null值的时候键保留

    由于业务需求...所以查阅资料,总结如下: 使用gson实现方法:只需要把new Gson()改为: new GsonBuilder().serializeNulls().create(); 就可以了 ...

  8. Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)

    一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...

  9. fastjson用法&Gson

    <dependency>    <groupId>com.google.code.gson</groupId>   <artifactId>gson&l ...

随机推荐

  1. swift - 添加定时器

    mport UIKit /// 控制定时器的类 class ZDTimerTool: NSObject { /// 定时器 // private var timer: Timer? /// GCD定时 ...

  2. Bootstrap(5)栅格系统

    一.移动设备优先 在 HTML5 的项目中,我们做了移动端的项目.它有一份非常重要的 meta,用于设置屏幕和设备等宽以及是否运行用户缩放,及缩放比例的问题. //分别为:屏幕宽度和设备一致.初始缩放 ...

  3. JDBC的学习

    JDBC —— 用Java访问数据库 一.需要用到第三方类:mysql-connector-java-5.0.8-bin.jar,并做好导包处理: 二.初始化驱动: 三.建立与数据库的链接: 四.创建 ...

  4. XSS 攻击的防御

    xss攻击预防,网上有很多介绍,发现很多都是只能预防GET方式请求的xss攻击,并不能预防POST方式的xss攻击.主要是由于POST方式的参数只能用流的方式读取,且只能读取一次,经过多次尝试,自己总 ...

  5. Split Array into Consecutive Subsequences

    659. Split Array into Consecutive Subsequences You are given an integer array sorted in ascending or ...

  6. mysql lost connection to server during query

    vim /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld]#3600000/1000=3600秒=1小时 wait_timeout =3600000#2G缓冲max ...

  7. Jmeter常用脚本开发之SOAP/XML-RPC Request

    SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议: SOAP/XML-RPC Request ...

  8. Android Studio 解析json文件出现中文乱码解决方法

    作为一个Android开发初学者,好不容易找到解决方法,跟大家分享一下, 其实很简单,只要保持服务器上的文件(date2.json)与软件的编码方式一样就行. 我用的Android Studio是ut ...

  9. Luogu2161 [SHOI2009]会场预约-线段树

    Solution 线段树维护 sum 表示区间内预约个数, L 表示区间最左边的预约, R 表示区间最右边的预约. $pushup$ 就是这样 : void up(int nd) { sum[nd] ...

  10. MCS-51与8086指令系统比较