几种序列化与get、set方法的关系
若get开头且第四个字母是大写的方法中有空指针异常时(无论有没有对应属性)
1.阿里巴巴的FastJson会出现空指针异常,证明与get开头的方法有关
2.Google的Gson不会出现异常,因为只和属性有关,和get开头的方法没关系
3.java开源的Jackson也会出现异常,证明与get开头的方法有关 但是set开头的方法有异常时,三种序列化都不会影响 下面是三种的maven依赖:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.1</version>
</dependency>
测试代码:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson; /**
* Created by huyanxia on 2017/11/16.
*/
public class TestFastJson {
public static void main(String[] args) {
test();
}
public static void test() {
Student student = new Student();
student.setName("huyanxia");
//1.阿里巴巴的FastJson会出现空指针异常
System.out.println(JSON.toJSON(student));
//同样会出现空指针异常
System.out.println(JSONObject.parseObject(JSON.toJSONString(student),student.getClass()));
//2.Google的Gson不会出现异常,因为只和属性有关,和get开头的方法没关系
Gson gson = new Gson();
gson.toJson(student);
//3.java开源的Jackson也会出现异常,证明与get开头的方法有关
ObjectMapper objectMapper = new ObjectMapper();
try {
objectMapper.writeValueAsString(student);
}catch(JsonProcessingException e){
e.printStackTrace();
}
}
}
class Student{
private String name;
private Integer age;
private String gender;
private Teacher teacher; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return null;
} public void setAge(Integer age) {
this.age = age;
} public String getGender() {
return null;
}
//没有Num属性,但是getNum方法中有异常,所有get开头的方法序列化时会被调用
public String getNum(){
return teacher.getName();
} //Num()方法中有异常,但是序列化正常
public String Num() {
return teacher.getName();
}
//setNum方法没有关系,即使其中有异常,序列化也没有问题
public void setNum(){
teacher.getName();
} public void setGender(String gender) {
this.gender = gender;
}
}
class Teacher{
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
JSON.toJSONString方法字符串输出的顺序与对象不一致,可以通过注解解决
第一种:通过在实体类添加@JSONType(orders={"name","age","gender","height","weight"})
@JSONType(orders={"name","age","gender","height","weight"})
public class Person {
private String name;
private Integer age;
private String gender;
private Double height;
private Double weight;
}
第二种:在属性上添加@JSONField(ordinal = 1)
public class Person {
@JSONField(ordinal = 1)
private String name;
@JSONField(ordinal = 2)
private Integer age;
@JSONField(ordinal = 3)
private String gender;
@JSONField(ordinal = 4)
private Double height;
@JSONField(ordinal = 5)
private Double weight;
}
JSON.toJSONString方法序列化时,需要排除一些字段,或者使字段名称缩短,可以使用注解
//不会序列化
@JSONField(serialize = false)
private ActivitySKUStatusEnum statusEnum;
//字段名称缩短
@JSONField(name = "type")
private PromotionEnum promotionEnum;
注意:
org.springframework.beans.BeanInstantiationException异常解决
在引入阿里巴巴的FastJson的maven依赖时,若项目已经引入spring包,那么需要排除阿里巴巴的spring,如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.3.2</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
友情提醒一下:
由于fastjson低版本存在反序列化漏洞,建议大家用较新版本,至少在1.2.28版本以上吧
几种序列化与get、set方法的关系的更多相关文章
- Android进程通信之一:两种序列化方式
2月下旬辞职了,去海南度假到现在,领略了一把三亚风情也算任性和 然而这样任性带来的后果就是..不行了我必须吐槽一句.. 没毕业的找工作就这么难嘛!投了57家一家面试机会都没有,好歹给个面试机会啊!!本 ...
- C#对象的三种序列化
要让一个对象支持.Net序列化服务,用户必须为每一个关联的类加上[Serializable]特性.如果类中有些成员不适合参与序列化(比如:密码字段),可以在这些域前加上[NonSerialized]特 ...
- BinaryFormatter、SoapFormatter、XML3种序列化
序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用.我想最主要的作用有:1.在进程下次 ...
- PHP四种序列化方案
原文地址:https://t.ti-node.com/thread/... 数据的序列化是一个非常有用的功能,然而目测很多人跟我一样,在刚接触这玩意的时候压根就不理解这货色到底是干啥用的,反正老师说了 ...
- http协议里定义的四种常见数据的post方法
原文 https://blog.csdn.net/charlene0824/article/details/51199292 关于http协议里定义的四种常见数据的post方法,分别是: applic ...
- java servlet 几种页面跳转的方法及传值
java servlet 几种页面跳转的方法及传值 java web 页面之间传值有一下这几种方式1.form 表单传递参数2.url地址栏传递参数3.session4.cookie5.appli ...
- 第一种SUSE Linux IP设置方法
第一种SUSE Linux IP设置方法ifconfig eth0 192.168.1.22 netmask 255.255.255.0 uproute add default gw 192.168. ...
- C#中常用的几种读取XML文件的方法
1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/
- Linux操作系统下三种配置环境变量的方法
现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/etc/profile文件 如果你的计算机仅仅作 ...
随机推荐
- every day a practice —— morning(3)
"WeChat does not store any chat histories. They are stored only on users' phones, computers or ...
- Selenium自动化测试框架入门整理
关注嘉为科技,获取运维新知 本文主要针对Selenium自动化测试框架入门整理,只涉及总体功能及框架要点介绍说明,以及使用前提技术基础要求整理说明.作为开发人员.测试人员入门参考. 本文参考:Se ...
- linux 下如何安装memcached 和启动服务
一.安装gcc # yum -y install gcc 二.安装libevent # wget http://www.monkey.org/~provos/libevent-2.0.12-stabl ...
- web功能模块测试用例(模板)
web功能模块测试用例(模板): https://wenku.baidu.com/view/4ada3464ddccda38376baff8.html 如图所示:
- 浅谈cookie、session
揭秘Cookie: cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是可 ...
- 深拷贝的原生js实现
面试时被问到怎么实现深拷贝,想都没想就用var obj2=JSON.parse(JSON.stringify(obj1))来实现.但面试官却要我用循环写出来,那就只能用递归了.可惜当时一下子忘了判断是 ...
- hdu-4738-tarjin/割边
http://acm.hdu.edu.cn/showproblem.php?pid=4738 求得是边权最小的割边,和求割点类似用tarjin,但要注意的是不能走从父亲过来的那一条边,在割点里那样理解 ...
- 提高Bash使用效率的方法
环境:centos6.5 1.移动 Ctrl + a :移到命令行首Ctrl + e :移到命令行尾 Ctrl + xx:在命令行首和光标之间移动 左右键移动字符 Ctrl+左右键移动单词(不记快捷键 ...
- 关于 EF 对象的创建问题
在开发过程中,项目往往被划分为多层,而一个请求过来往往是从表示层开始一层一层向下调用,那么如果我们在不同的层中都使用到了 EF 上下文对象,而 有好几层都这么创建一个 EF 对象然后对其进行操作,那么 ...
- python heapq模块使用
Python内置的heapq模块 Python3.4版本中heapq包含了几个有用的方法: heapq.heappush(heap,item):将item,推入heap >>> it ...