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 中国大陆许可协议进行许可。

posted @   primaryC  阅读(565)  评论(0编辑  收藏  举报
历史上的今天:
2023-03-07 Mysql 知识总结
点击右上角即可分享
微信分享提示
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.