【Web开发】Spring Boot中使用@JsonComponent

134 阅读1分钟

官网地址:www.baeldung.com/jackson-jso…

在SpringMVC框架中使用HttpMessageConverter转换器类来转换http请求和响应。HttpMessageConverter在转换http请求和响应的过程中,就需要将对象转为json,也就是序列化;或者将json转为对象,也就是反序列化。

在Spring Boot中默认是使用Jackson进行序列化和反序列化JSON数据的,那么除了可以用默认的之外,我们也可以编写自己的JsonSerializerJsonDeserializer类,来进行自定义操作。

@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());
    }
}