本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: 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/