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;
posted @ 2024-03-07 16:16  primaryC  阅读(689)  评论(0)    收藏  举报