官网地址:www.baeldung.com/jackson-jso…
在SpringMVC框架中使用HttpMessageConverter转换器类来转换http请求和响应。HttpMessageConverter在转换http请求和响应的过程中,就需要将对象转为json,也就是序列化;或者将json转为对象,也就是反序列化。
在Spring Boot中默认是使用Jackson进行序列化和反序列化JSON数据的,那么除了可以用默认的之外,我们也可以编写自己的JsonSerializer和JsonDeserializer类,来进行自定义操作。
@JsonComponent 是Spring boot的核心注解,使用@JsonComponent 之后就不需要手动将Jackson的序列化和反序列化手动加入ObjectMapper了。使用这个注解就够了。
例子:
Student类
定制Student的JSON序列化器
@JsonComponent
public class StudentSerializer extends JsonSerializer<Student> {
/**
* 只输出Student的name
* @param student
* @param jsonGenerator
* @param serializerProvider
* @throws IOException
*/
@Override
public void serialize(Student student, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(
"name",
student.getName());
jsonGenerator.writeStringField(
"id",
String.valueOf(student.getId()));
jsonGenerator.writeEndObject();
}
}
定制Student的反序列化器
@JsonComponent
public class StudentDeSerializer extends JsonDeserializer<Student> {
@Override
public Student deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JacksonException {
TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);
TextNode studentName = (TextNode) treeNode.get("name");
TextNode studentId = (TextNode) treeNode.get("id");
return new Student(Integer.valueOf(studentId.asText()),studentName.asText());
}
}