Fastjson和Gson零碎总结
一:用于测试的类
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零碎总结的更多相关文章
- FastJSON、Gson和Jackson性能对比
Java处理JSON数据有三个比较流行的类库FastJSON.Gson和Jackson.本文将测试这三个类库在JSON序列化和反序列化的方面表现,主要测试JSON序列化和反序列化的速度.为了防止由于内 ...
- FastJson和Gson和Json数据解析分析和用法
首先分析下目前号称最快的FastJson,这个是所有人都验证过的,解析速度确实比较快,不过也需要根据数据量来看,数据量小的时候,Gson性能要稍微优于FastJson,但在数据量大解析的情况下,Fas ...
- FastJSON、Gson、Jackson(简单了解使用)
下载地址(maven) Jackson:http://mvnrepository.com/search?q=jackson FastJson:http://mvnrepository.com/sear ...
- json工具包比较 fastjson jackson gson
对json进行json-object进行相互转化时,笔者接触到三种工具jar,现对其进行比较. fastjson:速度最快,阿里巴巴开源. jackson:springMvc 默认使用. gson:谷 ...
- FastJson与Gson小测试
最近用到Json来传输数据,找到两个比较简单的工具 Gson 和 FastJson随便测试一下两个工具的效率~ 1 package com.json.fast; import java.util.Ar ...
- Android进阶笔记17:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- 使用fastjson,gson解析null值的时候键保留
由于业务需求...所以查阅资料,总结如下: 使用gson实现方法:只需要把new Gson()改为: new GsonBuilder().serializeNulls().create(); 就可以了 ...
- Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- fastjson用法&Gson
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson&l ...
随机推荐
- Number & Maths类
Java Number & Math 类 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等. 实例 int a = 5000;float ...
- 在eclipse上写代码的时候,tomcat突然不能用了,重启都是闪一下就关了
严重: A child container failed during start 严重: The required Server component failed to start so Tomca ...
- java命令启动jacocoagent及生成报告
启动jacocoagent: java -Xms1024m -Xmx2048m -XX:-UseGCOverheadLimit -Ddruid.keepAlive=true -javaagent:/h ...
- JS中判断某个字符串是否包含另一个字符串的五种方法
String对象的方法 方法一: indexOf() (推荐) ? 1 2 var str = "123" console.log(str.indexOf("2&qu ...
- Windows删除服务方法
- 操作系统之CPU管理的直观想法
计算机:是工具,帮助解决实际问题 操作系统,是为了方便使用硬件 计算机模型: 图灵机,模拟人类计算 起初的图灵机就像一个只会做一道菜的厨师 通用图灵机,核心是设置控制器动作(修改控制器),把逻辑读入控 ...
- Linux CentOS 7 下 Apache Tomcat 7 安装与配置
前言 记录一下Linux CentOS 7安装Tomcat7的完整步骤. 下载 首先需要下载tomcat7的安装文件,地址如下: http://mirror.bit.edu.cn/apache/tom ...
- javascript 高级程序设计 二
这里我们直接进入主题: 在JS刚刚开始的时候,必须面临一个问题,那就是如何使的JS的加载和执行不会影响web核心语言HTML的展示效果,和HTML和谐共存. 在这个背景下<script>标 ...
- Yii2 数据操作Query Builder查询数据
Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...
- 常用MFC宏
最近我在用MFC开发一个智能家居监控平台的软件(用到了MSCOMM串口通信控件),当我通过在一个对话框类A中定义另一个对话框类B的对象访问B的public成员时,提示不可访问.后来经过多天的向朋友求救 ...