一、@JsonDeserialize
问题描述:
调媒体第三方接口时,🤫根据媒体返回id找到对应解析,所以可以在使用JSON转换解析时使用该注解,将对应关系存入Map中进行自动转换
举例:
1、在需要进行转换的字段上加上注解
@JsonDeserialize(using = KsDmpSourceDeserialize.class)
private String population_type;
2、定义KsDmpStatusDeserialize重写JsonDeserializer类
public class KsDmpStatusDeserialize extends JsonDeserializer<String> {
private static Map<Integer, String> map = new HashedMap<>();
static {
map.put(0, "计算中");
map.put(1, "已生效");
map.put(2, "已删除");
map.put(3, "上线中");
map.put(4, "已上线");
map.put(5, "计算失败");
map.put(6, "上线失败");
map.put(7, "已失效");
}
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) {
try {
if (jsonParser == null || jsonParser.getText() == null) {
return null;
}
Integer id = jsonParser.getValueAsInt();
return map.get(id);
} catch (Exception e) {
log.error(e.getMessage());
throw new BussinessException("未找到对应状态");
}
}
3、在字段转换时就能自动根据媒体返回的id转换成对应字段了
List<SiteVo> siteVos = JSONArray.parseArray(p.getSites(), SiteVo.class);
二、@JsonSerialize
在需要将数据格式整理好返回给前端时就需要用到该注解了
1、在需要进行转换的字段上加上注解
@JsonSerialize(using = KsDmpSourceDeserialize.class)
private List<Integer> population_type;
2、定义KsDmpStatusDeserialize重写JsonSerialize类
public class KsDmpSourceDeserialize extends JsonSerializer<List<Integer>> {
@Override
public void serialize(
List<Integer> stateList, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String join = StringUtils.join(stateList, ",");
jsonGenerator.writeString(join);
}
结果:那我们设置的states是个List,但是前端拿到的就是逗号分隔的字符串了。
区别
那这两个有什么区别呢:
@JsonSerialize:json序列化注解,作用于getter()方法,将java对象序列化为json数据。可以理解为用在处理返回的数据上
@JsonDeserialize:json反序列化注解,作用于setter()方法,将json数据反序列化为java对象。可以理解为用在处理接收的数据上。