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;
标签:null,JsonToken,spring,JSON,fieldType,parsingContext,序列化,public
From: https://www.cnblogs.com/cnff/p/17077262.html