spring-JSON序列化
1,使用场景。
SpringBoot 默认 json 为 JackJson。在 Controller 需要返回 Json 数据时,我们使用了 RestController,如果想对返回的数据进行一定的处理,也就是序列化对象为 Json 时使用。
反序列化,就是当接收的参数想做一定处理,获取到处理后的数据时候。
2,JsonSerializer 序列化
1,自定义序列化
继承 JsonSerializer 类,重写 serialize 方法。
public class SelfJsonSerializer extends JsonSerializer { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { if( o == null ){ jsonGenerator.writeObject("这是个 null 值"); }else if(o.toString().length() <= 0){ jsonGenerator.writeObject("这是个空白字符串"); }else{ jsonGenerator.writeObject(o.toString() + 111); } } }
2,使用 @JsonSerialize 注解
@Data public class Dog { private int id; @JsonSerialize(using = SelfJsonSerializer.class, nullsUsing = SelfJsonSerializer.class) private String name; private int price; public Dog(){} public Dog(int id, String name, int price){ this.id = id; this.name = name; this.price = price; } }
using
参数不为 null 时使用的序列化方法。
nullsUsing
参数为 null 时使用的序列化方法。
3,自定义反序列化
1,继承 JsonDeserializer,实现 deserialize 方法。
public class BdipIdArgumentDeserialize extends JsonDeserializer<Object> { @Override public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonStreamContext parsingContext = p.getParsingContext(); JsonToken currentToken = p.getCurrentToken(); Type fieldType; if (currentToken == JsonToken.START_ARRAY) { parsingContext = parsingContext.getParent(); //获取泛型类型 fieldType = TypeUtil.getTypeArgument(ReflectUtil .getField(parsingContext.getCurrentValue().getClass(), parsingContext.getCurrentName()) .getGenericType()); } else { fieldType = ReflectUtil .getField(parsingContext.getCurrentValue().getClass(), parsingContext.getCurrentName()) .getType(); } if (currentToken == JsonToken.VALUE_STRING) { if(p.getValueAsString() != null && !p.getValueAsString().equals("")) { //兼容未加密的情况 return Convert.convert(fieldType, EncryptUtil.decryptMsg(p.getValueAsString()) ); } } //int 就直接返回 if (currentToken == JsonToken.VALUE_NUMBER_INT) { return Convert.convert(fieldType, p.getIntValue()); } if (currentToken == JsonToken.START_ARRAY) { List<Object> list = new ArrayList<>(); while (p.nextToken() != JsonToken.END_ARRAY) { list.add(Convert.convert(fieldType, EncryptUtil.decryptMsg(p.getText()))); } return list; } return null; } }
2,在实体类上注解
@JsonDeserialize(using = BdipIdArgumentDeserialize.class) Integer userId;
本文作者:Hi.PrimaryC
本文链接:https://www.cnblogs.com/cnff/p/17077262.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
框架 / spring-应用篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-03-07 Mysql 知识总结