几种序列化与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文件 如果你的计算机仅仅作 ...
随机推荐
- Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。
Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...
- 使用C#读取网站相对路径文件夹下所有图片
public JsonResult GetCourseInitCover() { //设置相对路径 string imgurl = Server.MapPath("~/Content/ima ...
- Confluence 6 可以自定义的元素
色彩配色方案允许你对 UI 中的元素色彩进行编辑,包括顶部条,标签页和背景色. 有一些下面的 UI 元素被用在特定的主题中,配色方案的修改可能不会对这些元素有效. 顶部条(Top Bar)—— 顶部导 ...
- confirm提示弹出确定和取消按钮
js----> var con = confirm('这是一个确定加取消的提示窗口') if(con==true){ document.write("点击了确定按钮") }e ...
- PHP字符串函数小结
1. strlen:获得字符串长度 2. substr:字符串截取函数 格式:string substr ( string $string , int $start [, int $length ] ...
- 『MXNet』第六弹_Gluon性能提升
一.符号式编程 1.命令式编程和符号式编程 命令式: def add(a, b): return a + b def fancy_func(a, b, c, d): e = add(a, b) f = ...
- TOR的十个最好的替代工具
TOR的十个最好的替代工具: 一.Comodo Dragon(基于Chromium) TOR基于Firefox,因为我们换个口味,首先推荐一个基于开源项目Chromium的Comodo Dragon, ...
- Qt Widgets——抽象按钮及其继承类
QAbstractButton是有关“按钮”的基类 描述了一个按钮应该具有的组成.它的公有函数如下: QAbstractButton(QWidget * parent = ) ~QAbstractBu ...
- Binary Analysis Tool安装使用教程
Binary Analysis Tool(BAT)是一个用于检测二进制文件使用到的开源组件,协助及早发现程序发布后可能会面临的开源协议解执的开源免费检测工具. 一.安装BAT和bat-extratoo ...
- SecureCRT sftp上传文件报错:put: failed to upload xxx 拒绝访问
1.问题 使用sftp上传文件时报错:put: failed to upload xxx 拒绝访问.类似下图所示: 2.原因 造成这个问题的原因可能有两个,一是要上到的那个目录剩余磁盘空间不足,二是打 ...