一、fastjson介绍。
fastjson是由alibaba开源的一套json处理器。与其他json处理器(如Gson,Jackson等)和其他的Java对象序列化反序列化方式相比,有比较明显的性能优势。虽然好用,但是也有一些使用过程中坑,今天给大家一一列举一下。
二、环境准备:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
三、问题列举:
1、内部类,从json字符串,反序列化时,莫名其妙的为null,导致程序报空指针异常。
demo
public class Response {
private int nret;
private String desc;
private Detail detail;
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Response() {
}
public Response(int nret, String desc) {
this.nret = nret;
this.desc = desc;
}
public Detail getDetail() {
return detail;
}
public void setDetail(Detail detail) {
this.detail = detail;
}
public int getNret() {
return nret;
}
public void setNret(int nret) {
this.nret = nret;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Response{" +
"nret=" + nret +
", desc='" + desc + '\'' +
", detail=" + detail +
'}';
}
class Detail{
private String item;
private String name;
private String state;
public Detail() {
}
public Detail(String item, String name, String state) {
this.item = item;
this.name = name;
this.state = state;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public String toString() {
return "Detail{" +
"item='" + item + '\'' +
", name='" + name + '\'' +
", state='" + state + '\'' +
'}';
}
}
}
public class TestMain {
public static void main(String[] args) {
Response response=new Response(1001,"success");
Response.Detail detail=response.new Detail("item01","占位","1001");
response.setDetail(detail);
//response.setCode("200");
String res= JSONObject.toJSONString(response);
System.out.println("res="+res);
Response response1=JSONObject.parseObject(res,Response.class);
System.out.println("response1="+response1.toString());
}
}
测试:
res={"desc":"success","detail":{"item":"item01","name":"占位","state":"1001"},"nret":1001}
response1=Response{nret=1001, desc='success', detail=null}
解决思路:
TODO:分别加上默认的构造方法。
2、针对属性为空时,转json字符串时,属性被丢弃
public class TestMain {
public static void main(String[] args) {
Response response=new Response(1001,"success");
Response.Detail detail=response.new Detail("item01","占位","1001");
response.setDetail(detail);
//response.setCode("200");
String res= JSONObject.toJSONString(response);
System.out.println("res="+res);
Response response1=JSONObject.parseObject(res,Response.class);
System.out.println("response1="+response1.toString());
}
}
测试:
code属性没有赋值,转成json字符串时,属性code被丢弃了:
res={"desc":"success","detail":{"item":"item01","name":"占位","state":"1001"},"nret":1001}
response1=Response{nret=1001, desc='success', detail=null}
解决思路:
TODO:分别加上默认的构造方法。
//转换时,增加序列化特性SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty
String res= JSONObject.toJSONString(response,SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
目前收集了以上两个典型问题,有新的问题,欢迎老铁评论添加,共同学习,共同进步!