前言
以前项目一直在用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库看自己吧。