情景回顾
以前遇到这种实体类的1, 2转为男, 女这种业务一般都是配置字典然后前端就直接读字典解析了, 几乎没咋用过在java代码中解析, 偶尔实在要用可能就是直接代码里面自己解析一下返回前端, 并没有考虑使用fastjson或者jackjson解决
今天闲的没事就想要fastjson解决一下, 无非就是新建一个类实现一个接口重写一个方法然后把转化逻辑写进去, 最后在实体类加一个注解把这个类的class写进去, 都是老套路了, 没啥意思, 这么没啥意思的东西让我搞了一个小时, 真坑!!!
干前准备
fastjson依赖坐标
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.39</version>
</dependency>
老套路办法
- 首先先写一个GenderSerializer, 都是老套路
public class GenderSerializer implements ObjectWriter<String> {
@Override
public void write(JSONWriter writer, Object object, Object fieldName, Type fieldType, long features) {
if (object == null) {
writer.writeString("未知");
return;
}
String gender = object.toString();
switch (gender) {
case "1":
writer.writeString("男");
break;
case "2":
writer.writeString("女");
break;
default:
writer.writeString("未知");
}
}
}
- 在实体类给gender字段加注解@JSONField(serializeUsing = GenderSerializer.class)
@Data
@TableName("user")
public class User implements Serializable {
/*
* 主键(自增)
*/
private int id;
/*
* 用户名
*/
private String username;
/*
* 密码
*/
private String password;
/*
* 性别
*/
@JSONField(serializeUsing = GenderSerializer.class)
private String gender;
}
遇到问题
到这里其实已经完事了, 直接调接口测试, 发现居然并没有解析为男,女, 还是返回字符串1,2
解决问题
在GenderSerializer 中的write方法内打断点, 发现没有进入直接返回, 当然返回的数据是字符串1,2
试了各种方法都不行呢, 苦恼!!!
网上说不直接返回User对象, 使用JSON.toJSONString(user)方法手动序列化为String类型可以解析, 试了一下果然可以, 但是我肯定不能反悔String啊, 我要返回对象, 我要对象, 唉!
然后我就搜啊, 边搜边试…
居然是因为
Spring MVC 默认使用 Jackson 作为 JSON 序列化器,而 @JSONField(serializeUsing = GenderSerializer.class) 是 FastJSON 的注解,只对 FastJSON 生效,对 Jackson 无效
有点坑爹, 但到此问题也就已经解决了
前面的代码不用动, 只需要强制 Spring MVC 使用 FastJSON就可以了, 配置如下:
@Configuration
public class FastJsonConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 1. 移除默认的 Jackson 转换器
converters.removeIf(converter -> converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter);
// 2. 添加 FastJSON2 转换器
FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
converters.add(fastJsonConverter);
}
}
坑爹, 下课!