若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方法的关系的更多相关文章

  1. Android进程通信之一:两种序列化方式

    2月下旬辞职了,去海南度假到现在,领略了一把三亚风情也算任性和 然而这样任性带来的后果就是..不行了我必须吐槽一句.. 没毕业的找工作就这么难嘛!投了57家一家面试机会都没有,好歹给个面试机会啊!!本 ...

  2. C#对象的三种序列化

    要让一个对象支持.Net序列化服务,用户必须为每一个关联的类加上[Serializable]特性.如果类中有些成员不适合参与序列化(比如:密码字段),可以在这些域前加上[NonSerialized]特 ...

  3. BinaryFormatter、SoapFormatter、XML3种序列化

    序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用.我想最主要的作用有:1.在进程下次 ...

  4. PHP四种序列化方案

    原文地址:https://t.ti-node.com/thread/... 数据的序列化是一个非常有用的功能,然而目测很多人跟我一样,在刚接触这玩意的时候压根就不理解这货色到底是干啥用的,反正老师说了 ...

  5. http协议里定义的四种常见数据的post方法

    原文 https://blog.csdn.net/charlene0824/article/details/51199292 关于http协议里定义的四种常见数据的post方法,分别是: applic ...

  6. java servlet 几种页面跳转的方法及传值

    java servlet 几种页面跳转的方法及传值   java web 页面之间传值有一下这几种方式1.form 表单传递参数2.url地址栏传递参数3.session4.cookie5.appli ...

  7. 第一种SUSE Linux IP设置方法

    第一种SUSE Linux IP设置方法ifconfig eth0 192.168.1.22 netmask 255.255.255.0 uproute add default gw 192.168. ...

  8. C#中常用的几种读取XML文件的方法

    1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/

  9. Linux操作系统下三种配置环境变量的方法

    现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/etc/profile文件 如果你的计算机仅仅作 ...

随机推荐

  1. 文献导读 - Machine Learning Identifies Stemness Features Associated with Oncogenic Dedifferentiation

    参考: Machine Learning Identifies Stemness Features Associated with Oncogenic Dedifferentiation 前所未有!1 ...

  2. 比对软件之STAR的使用方法

    建索引 普通比对 二次比对 用于cufflinks和stringtie的比对 待续~ 参考:比对软件STAR的简单使用

  3. 动态加载DataGrid表头及数据

    初始化表头 js生成前端 /*初始化表头*/ function initDataGridTitle(id) { $.ajax({ url: '/${appName}/report/***/***', ...

  4. 反射API(一)

    <?php function classData(ReflectionClass $class) { echo '<hr>'; $details = '当前文件:'; $detail ...

  5. Maximum Questions CodeForces - 900E (字符串,dp)

    大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$ ...

  6. 两个约束下的dp问题

    洛谷P1510 分析:本质上还是一个01背包,将体力当做重量,体积当做价值.配上滚动数组 即dp[j]代表在体力耗费为j时最大能搬运多少体积的石头,当dp[j]>v时就说明存在满足情况的解,这样 ...

  7. 『TensorFlow』分布式训练_其三_多机分布式

    本节中的代码大量使用『TensorFlow』分布式训练_其一_逻辑梳理中介绍的概念,是成熟的多机分布式训练样例 一.基本概念 Cluster.Job.task概念:三者可以简单的看成是层次关系,tas ...

  8. TCP如何保证可靠性

    如何保证可靠性? 1.校验和.在TCP的首部中有一个占据16为的空间用来放置校验和的结果. 这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化.如果收到段的检验和有差错,TCP将丢弃这个报文 ...

  9. Java中static的用法,初始化块

    使用 Arrays 类操作 Java 中的数组语法: Arrays.sort(数组名); 可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该 ...

  10. JSP调试技巧

    我先谈谈: 我的经验就是多装几个服务器,这个查不出错误,用另一个,这个方法很好用. ---------------------------------------------------------- ...