上一篇中写了,使用mybatis时自定义的类型和数据库之间的映射,但是自定义的类型在返回时如何转Json呢?
我们需要重写自定义类型的序列化规则,定义自己的序列化类继承JsonSerializer,并重写其中的serialize方法。
以上篇中自定义的CommonTypeString为例:
/**
* 自定义CommonTypeString类型序列化规则
*/
public class CommonTypeStringSerializer extends JsonSerializer<CommonTypeString> {
@Override
public void serialize(CommonTypeString value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (null != value && null != value.getValue()) {
gen.writeObject(value.getValue());
} else {
gen.writeObject(false);
}
}
}
在转json时,只需要将CommonTypeString类中存放数据的value字段返回即可。
如何使用该自定义序列化规则:
方法一:
在CommonTypeString属性上添加注解@JsonSerialize(using = CommonTypeStringSerializer .class)该属性在返回时,就会使用该序列化规则进行转换为json。
@TableName("student_student")
@Data
public class Student extends BaseModelDto {
/**
* 姓名
*/
@JsonSerialize(using = CommonTypeStringSerializer.class)
private CommonTypeString name;
}
方法二:
当然当程序中大量出现这样的自定义类型时,这种添加注解的方式就很繁琐了,因为目前使用spring-cloud所以直接将自定义的序列化规则写到配置类中,并将自定义类型和该类型的序列化规则类 联系在一起即可:
@Configuration
public class JacksonConfig {
/**
* 自定义CommonTypeString类型序列化规则
*/
static class CommonTypeStringSerializer extends JsonSerializer<CommonTypeString> {
@Override
public void serialize(CommonTypeString value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (null != value && null != value.getValue()) {
gen.writeObject(value.getValue());
} else {
gen.writeObject(false);
}
}
}
@Bean
public SimpleModule simpleModule() {
SimpleModule module = new SimpleModule();
//声明序列化类
CommonTypeStringSerializer serializer_string = new CommonTypeStringSerializer();
//添加序列化,哪个类型对应哪个序列化类
module.addSerializer(CommonTypeString.class, serializer_string);
return module;
}
}
推荐使用方法二进行转换,这种方式不用再添加注解即可实现自定义类型转json的工作。