springboot使用@JsonComponent和StdSerializer实现返回数据的自定义序列化-CSDN博客

237 阅读1分钟

文章目录

写在前面

我们都知道springboot使用@ResponseBody时返回的对象会转成json格式,但是返回的数据格式我们需要调整怎么办?(比如说日期格式的调整、枚举显示的 调整等等)

此时,就可以用到序列化器,将返回的值进一步格式化成我们想要的样子。

自定义序列化器

Controller


   /**
    * 测试自定义序列化
    */
   @ResponseBody
   @RequestMapping("/serializer")
   public TestSchool testSerializer(){
       TestSchool testSchool = new TestSchool();
       testSchool.setId("1");
       testSchool.setName("zhangsan1");
       testSchool.setDisc("desc1");
       return testSchool;
   }

   /**
    * 测试自定义序列化
    */
   @ResponseBody
   @RequestMapping("/serializer2")
   public List<TestSchool> testSerializer2(){
       List<TestSchool> list= new ArrayList<>();
       TestSchool testSchool = new TestSchool();
       testSchool.setId("1");
       testSchool.setName("zhangsan1");
       testSchool.setDisc("desc1");
       list.add(testSchool);
       TestSchool testSchool2 = new TestSchool();
       testSchool2.setId("2");
       testSchool2.setName("zhangsan2");
       testSchool2.setDisc("desc2");
       list.add(testSchool2);
       return list;
   }

Model

public class TestSchool {

    private String id;
    private String name;
    private String disc;
    // get set
}

序列化器(重点)

import com.boot.cxf.server.model.TestSchool;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
* 自定义序列化逻辑
*/
@JsonComponent // 用于把该序列化类注册到JsonComponentModule中。
public class TestSerializer extends StdSerializer<TestSchool> {
    protected TestSerializer() {
        super(TestSchool.class);
    }
 
    /**
    * 序列化逻辑
    */
    @Override
    public void serialize(TestSchool testSchool, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        // JsonGenerator中有很多有用的数据,比如gen.getOutputContext()可以拿到原始的字段属性
        // 调用JsonGenerator的write开头的方法以写入序列化后的数据
        Map<String, String> map = new HashMap<>();
        map.put("values", testSchool.getId() + "|" + testSchool.getName() + "|" + testSchool.getDisc());
        jsonGenerator.writeObject(map);
    }
}

测试一下

在这里插入图片描述
在这里插入图片描述

总结

使用该序列化器可以使返回的结果输出为我们想要的样子。

但是如果想要输入的结果也想要自定义呢?
答案:可以用自定义参数解析器,或者反序列化器。

spring MVC使用自定义的参数解析器解析参数

爆破专栏丨SpringBoot2.x系列教程之自定义JSON序列化器和反序列化器