fastjson转jackson的一些比较

前言

以前项目一直在用fastjson作为json的转换,但是最近发现FASTJSON的bug比较多:https://github.com/alibaba/fastjson/issues/3073

哎,这个简单说一下fastjson和jackson的一些不同。

 

1:如果缺少定义,fastjson可以转换部分数据,而jackson则会报错

有个类:

public class User {  
    private String name;  
    private Integer age;  
    private Date birthday;  
    //private String email;  
      
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
      
    public Integer getAge() {  
        return age;  
    }  
    public void setAge(Integer age) {  
        this.age = age;  
    }  
      
    public Date getBirthday() {  
        return birthday;  
    }  
    public void setBirthday(Date birthday) {  
        this.birthday = birthday;  
    }  
      
    //public String getEmail() {  
    //    return email;  
    //}  
    //public void setEmail(String email) {  
    //    this.email = email;  
    //}  
}  

数据:

String json = "{\"name\":\"小民\",\"age\":20,\"birthday\":844099200000,\"email\":\"xiaomin@sina.com\"}";  

用fastjson能够成功解析,

 

而用jackson解析会报错:

解决1:

添加注释:

@JsonIgnoreProperties(ignoreUnknown = true)

解决2:补全email属性

 

2:泛型转换

public class HttpResponse<T>  implements Serializable {
    private static final long serialVersionUID = -1066414629201553447L;

    private Integer code;

    private String message;

    private T data;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}


public class VersionId {
    private Long id;

    public VersionId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

数据:

String response = "{"code":200,"message":"OK","data":{"id":36}}"

fastjson解析正常

HttpResponse<VersionId> res = JSON.parseObject(response, new TypeReference<HttpResponse<VersionId>>(){});

jackson解析报错

ObjectMapper mapper = new ObjectMapper(); HttpResponse<VersionId> res = mapper.readValue(response, new TypeReference<HttpResponse<VersionId>>(){});

解析报错:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.zcy.VersionId` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)"{"code":200,"message":"OK","data":{"id":36}}"; line: 1, column: 36] (through reference chain: com.zcy.HttpResponse["data"])
 

解决:在VersionId内部添加一个构造函数:

VersionId() {};

 

结论

1:虽然fastjson的bug比较多,但是修复还是比较及时,而且使用起来比较方便

2:jackson注释比较多,sprintboot内部也在使用

用哪个json库看自己吧。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值