fastjson 简介
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
Fastjson 源码地址:https://github.com/alibaba/fastjson
Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
直接上代码
因为是公司的项目,所以就自己写了一个小demo来复现一下这个坑,直接上代码.
先定义一个类User
public class User {
public String name;
public void setName(String name){
this.name = name;
}
public static void main(String[] args) {
User user = new User();
user.setName("夏洛特");
String json = JSONObject.toJSONString(user);
System.out.println(json);
}
}
跑一下main方法,这样是没问题的输出:{“name”:“夏洛特”}
之后在User对象中加入一个getMaDongMei()方法,方法返回一个字符串
public class User {
public String name;
public void setName(String name){
this.name = name;
}
public String getMaDongMei(){
return "马冬梅";
}
public static void main(String[] args) {
User user = new User();
user.setName("夏洛特");
String json = JSONObject.toJSONString(user);
System.err.println(json);
}
}
这个时候问题就出来了
输出:{“maDongMei”:“马冬梅”,“name”:“夏洛特”}
fastjson会调用有返回值的前缀带get的正常带有驼峰的方法,并将返回值和get方法的get后面部分内容,当作一个参数放入json中
如果使用的不好的话,会出现更加严重的问题
尝试在方法中加入getXiaoMing()方法,返回对象User:
public class User {
public String name;
public void setName(String name){
this.name = name;
}
public User getXiaoMing(){
User xiaoMing = new User();
xiaoMing.setName("小明");
return xiaoMing;
}
public static void main(String[] args) {
User user = new User();
user.setName("夏洛特");
String json = JSONObject.toJSONString(user);
System.err.println(json);
}
}
再跑一下
直接报:Exception in thread “main” java.lang.StackOverflowError
栈溢出
原因是fastjson会调用对象中的get开头的方法,然后该方法中返回了一个User对象,他去解析User对象的时候又会去调用里面的getXiaoMing方法,就等于是一直的递归下去,导致栈溢出.
如果你的get方法和你对象中的变量名称是一样的fastjson会进行一次去重,所以在对象中定义方法名称的时候注意如果不是获取对象的变量,最好不要使用get开头.
有兴趣的同学也可以复制代码试一下