若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. English trip M1 - PC6 Likes and Dislike Teacher:Jade

    In this lesson you will learn to talk about likes and dislikes. 课上内容(Lesson) # 通常在习惯性的表达式用 it's 来表达w ...

  2. Practical Node.js摘录(2018版)第1,2章。

    大神的node书,免费 视频:https://node.university/courses/short-lectures/lectures/3949510 另一本书:全栈JavaScript,学习b ...

  3. codeforces708b// Recover the String //AIM Tech Round 3 (Div. 1)

    题意:有一个01组成的串,告知所有长度为2的子序列中,即00,01,10,11,的个数a,b,c,d.输出一种可能的串. 先求串中0,1的数目x,y. 首先,如果00的个数a不是0的话,设串中有x个0 ...

  4. Confluence 6 应该如何在我的空间中组织内容

    页面和博客 你在 Confluence 中创建的任何内容,从会议记录到回顾和任何中间的内容,不管来源是博客和页面. 你的主页将是任何访问你网站中的用户首先看到的内容.为了让用户更加容易的找到他们需要查 ...

  5. Vue音乐项目笔记(一)

    看到一位小可爱的手记,这里记录一下自己需要注意的地方的链接 1.手写轮播图(上) https://blog.csdn.net/weixin_40814356/article/details/80298 ...

  6. JS中循环逻辑和判断逻辑的使用实例

    源代码见: https://github.com/Embrace830/JSExample &&和||的理解 a || b:如果a是true,那么b不管是true还是false,都返回 ...

  7. Luffy之虚拟环境.项目搭建,目录日志等配置信息

    1. 项目开发前 1.1 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的 ...

  8. Codefores 1151E Number of Components

    大意:给定n元素序列$a$, $1\le a_i \le n$, 定义函数$f(l,r)$表示范围在$[l,r]$以内的数构成的连通块个数, 求$\sum\limits_{i=1}^{n}\sum\l ...

  9. 【其他】【服务器】【2】把jar包做成服务,在Service中管理

    三个文件:service_install.xml,service_install.exe,install-service.bat: 和xx.jar放在同一个目录下 service_install.xm ...

  10. zend framwork项目基本操作

    1.首先,我们做项目是采用db的方式来编写sql语句的. 2.查询: fetchOne()   查询一个字段,如果没有指定就只查询第一个字段,只能得到一个值. fetchRow()    查询一行数据 ...