若get開頭且第四個字母是大寫的方法中有空指針異常時(無論有沒有對應屬性)
1.阿里巴巴的FastJson會出現空指針異常,證明與get開頭的方法有關
2.Google的Gson不會出現異常,因為只和屬性有關,和get開頭的方法沒關系
3.java開源的Jackson也會出現異常,證明與get開頭的方法有關
但是set開頭的方法有異常時,三種序列化都不會影響
下面是三種的maven依賴:
1 <dependencies> 2 <dependency> 3 <groupId>com.alibaba</groupId> 4 <artifactId>fastjson</artifactId> 5 <version>1.2.28</version> 6 </dependency> 7 <dependency> 8 <groupId>com.google.code.gson</groupId> 9 <artifactId>gson</artifactId> 10 <version>2.2.4</version> 11 </dependency> 12 <dependency> 13 <groupId>com.fasterxml.jackson.core</groupId> 14 <artifactId>jackson-databind</artifactId> 15 <version>2.3.1</version> 16 </dependency>
測試代碼:
1 import com.alibaba.fastjson.JSON; 2 import com.alibaba.fastjson.JSONObject; 3 import com.fasterxml.jackson.core.JsonProcessingException; 4 import com.fasterxml.jackson.databind.ObjectMapper; 5 import com.google.gson.Gson; 6 7 /** 8 * Created by huyanxia on 2017/11/16. 9 */ 10 public class TestFastJson { 11 public static void main(String[] args) { 12 test(); 13 } 14 public static void test() { 15 Student student = new Student(); 16 student.setName("huyanxia"); 17 //1.阿里巴巴的FastJson會出現空指針異常 18 System.out.println(JSON.toJSON(student)); 19 //同樣會出現空指針異常 20 System.out.println(JSONObject.parseObject(JSON.toJSONString(student),student.getClass())); 21 //2.Google的Gson不會出現異常,因為只和屬性有關,和get開頭的方法沒關系 22 Gson gson = new Gson(); 23 gson.toJson(student); 24 //3.java開源的Jackson也會出現異常,證明與get開頭的方法有關 25 ObjectMapper objectMapper = new ObjectMapper(); 26 try { 27 objectMapper.writeValueAsString(student); 28 }catch(JsonProcessingException e){ 29 e.printStackTrace(); 30 } 31 } 32 } 33 class Student{ 34 private String name; 35 private Integer age; 36 private String gender; 37 private Teacher teacher; 38 39 public String getName() { 40 return name; 41 } 42 43 public void setName(String name) { 44 this.name = name; 45 } 46 47 public Integer getAge() { 48 return null; 49 } 50 51 public void setAge(Integer age) { 52 this.age = age; 53 } 54 55 public String getGender() { 56 return null; 57 } 58 //沒有Num屬性,但是getNum方法中有異常,所有get開頭的方法序列化時會被調用 59 public String getNum(){ 60 return teacher.getName(); 61 } 62 63 //Num()方法中有異常,但是序列化正常 64 public String Num() { 65 return teacher.getName(); 66 } 67 //setNum方法沒有關系,即使其中有異常,序列化也沒有問題 68 public void setNum(){ 69 teacher.getName(); 70 } 71 72 public void setGender(String gender) { 73 this.gender = gender; 74 } 75 } 76 class Teacher{ 77 private String name; 78 79 public String getName() { 80 return name; 81 } 82 83 public void setName(String name) { 84 this.name = name; 85 } 86 }
JSON.toJSONString方法字符串輸出的順序與對象不一致,可以通過注解解決
1 第一種:通過在實體類添加@JSONType(orders={"name","age","gender","height","weight"}) 2 @JSONType(orders={"name","age","gender","height","weight"}) 3 public class Person { 4 private String name; 5 private Integer age; 6 private String gender; 7 private Double height; 8 private Double weight; 9 } 10 第二種:在屬性上添加@JSONField(ordinal = 1) 11 public class Person { 12 @JSONField(ordinal = 1) 13 private String name; 14 @JSONField(ordinal = 2) 15 private Integer age; 16 @JSONField(ordinal = 3) 17 private String gender; 18 @JSONField(ordinal = 4) 19 private Double height; 20 @JSONField(ordinal = 5) 21 private Double weight; 22 }
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版本以上吧