FastJson序列化类的问题
1. getter setter 的问题
有次开发中使用FastJson时出现了个bug,说是类里面没有某个属性,debug后发现它默认通过get方法取出属性值,也就是说FastJson默认通过JavaBean规范进行对象序列化。
所以命名方法时若不是类的getter/setter方法时,不要以get或set为前缀命名。
测试:
public class FastJsonTest {public static void main(String[] args) {// json转对象String jsonStr = "{\"name\":\"张三\"}";Student student = JSON.parseObject(jsonStr, Student.class);System.out.println("json转对象: "+student.toString());// 对象转jsonStudent student1 = new Student();student1.setName("张三");String jsonString = JSONObject.toJSONString(student1);System.out.println("对象转json: "+jsonString);}}class Student {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}// 无Grade属性public Integer getGrade() {return 100;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';}}
输出:
json转对象: Student{name='张三'}
对象转json: {"grade":100,"name":"张三"}
类中写了个getGrade方法,被认为是有一个Grade属性,这样在其它地方使用可能会有问题。
2. 布尔类型属性名不能以is开头
【强制】POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列 化错误。
说明:在本文MySQL 规约中的建表约定第一条,表达是与否的值采用 is_xxx的命名方式,所以,需要在 设置从 is_xxx到xxx的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时 候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
引自:Java开发手册(泰山版)编程规约,命名风格一节。
如果以 Boolean isDeleted 命名属性,那它对应getter方法的正确写法应该是isIsDeleted(),但是最好避免这样写。
FastJson序列化类的问题
1. getter setter 的问题
有次开发中使用FastJson时出现了个bug,说是类里面没有某个属性,debug后发现它默认通过get方法取出属性值,也就是说FastJson默认通过JavaBean规范进行对象序列化。
所以命名方法时若不是类的getter/setter方法时,不要以get或set为前缀命名。
测试:
public class FastJsonTest {public static void main(String[] args) {// json转对象String jsonStr = "{\"name\":\"张三\"}";Student student = JSON.parseObject(jsonStr, Student.class);System.out.println("json转对象: "+student.toString());// 对象转jsonStudent student1 = new Student();student1.setName("张三");String jsonString = JSONObject.toJSONString(student1);System.out.println("对象转json: "+jsonString);}}class Student {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}// 无Grade属性public Integer getGrade() {return 100;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';}}
输出:
json转对象: Student{name='张三'}
对象转json: {"grade":100,"name":"张三"}
类中写了个getGrade方法,被认为是有一个Grade属性,这样在其它地方使用可能会有问题。
2. 布尔类型属性名不能以is开头
【强制】POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列 化错误。
说明:在本文MySQL 规约中的建表约定第一条,表达是与否的值采用 is_xxx的命名方式,所以,需要在 设置从 is_xxx到xxx的映射关系。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时 候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
引自:Java开发手册(泰山版)编程规约,命名风格一节。
如果以 Boolean isDeleted 命名属性,那它对应getter方法的正确写法应该是isIsDeleted(),但是最好避免这样写。
发布评论