本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2016/08/28/write-your-own-jackson-serializer/
Jackson绝对是一个方便好用的工具,可以快速的在json和java object之间转换。Spring中也集成了Jackson,所以可以方便的自动赋予这个特性,比如使用restOperations消费API的时候。
但是有时候要消费的API要求的json很诡异,比如创建新用户,对方要求的格式如下:
{
"data": {
"attrs": {
"firstName": "FN",
"lastName": "LN"
},
"dateOfBirth": {
"detail": "1900-01-01"
}
}
}
如果直接使用,那么我们的类对象就有点复杂了,需要嵌套好几层。但是我们也清楚,业务需要的不过就是三个数据而已,姓;名;生日。
这个时候就可以考虑自定义Serializer了。
比如这样
class CustomerSerializer extends JsonSerializer<Customer> {
@Override
public void serialize(Customer value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeObjectFieldStart("data");
gen.writeObjectFieldStart("attrs");
gen.writeStringField("firstName", value.getFirstName());
gen.writeStringField("lastName", value.getLastName());
gen.writeEndObject();
gen.writeObjectFieldStart("dateOfBirth");
gen.writeStringField("detail", new DateTime(value.getDateOfBirth()).toString("yyyy-MM-dd"));
gen.writeEndObject();
gen.writeEndObject();
gen.writeEndObject();
}
}
JsonGenerator的时候要注意闭合,也就是有了Start,就一定要End。
然后在我们的对象中添加注解
@JsonSerialize(using = CustomerSerializer.class)
public class Customer {
private String firstName;
private String lastName;
private Date dateOfBirth;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
这样转为Json的时候就不会使用默认的序列化方法,而是使用我们自定义的Serializer去完成。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2016/08/28/write-your-own-jackson-serializer/