自定义Jackson Serializer实现复杂Json转换

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: 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/

发表评论