文章目录
- 写在前面
- 自定义序列化器
- Controller
- Model
- 序列化器(重点)
- 测试一下
- 总结
写在前面
我们都知道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序列化器和反序列化器