序列化工具-fastjson使用中的问题收集,别在掉坑里了

一、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);
 

目前收集了以上两个典型问题,有新的问题,欢迎老铁评论添加,共同学习,共同进步!

猜你喜欢

转载自blog.csdn.net/jason_jiahongfei/article/details/112516029