Gson系列4 --- 策略篇 -- ExclusionStrategy

本文详细介绍了Gson库中的ExclusionStrategy策略,通过实例展示了如何使用排除注解来控制序列化和反序列化过程中的字段。通过对实体类的设定和测试,揭示了ExclusionStrategy在实际应用中的作用。

1、简述

 
[ExclusionStrategy]
排除策略
   用于排除相关的属性
   作用等同于 @Expose transient

自定义相关注解 进行排除操作  
   自定义排除属性注解

2、实体

package sun.rain.amazing.gson.strategy.exclude;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 序列化时 用于排除 属性
 * @author sunRainAmazing
 */
@Target( ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface GsonExclude {
}
package sun.rain.amazing.gson.strategy.exclude;

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import sun.rain.amazing.gson.strategy.exclude.GsonExclude;

/**
 * @author sunRainAmazing
 */
public class GsonExclusionStrategy implements ExclusionStrategy {
    /**
     * 是否跳过属性 不序列化
  * 返回 false 代表 属性要进行序列化
  * @param f
     * @return
     */
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        /**
         * 判断当前属性是否带有GsonExclude排除的注解
    * 若有 则 不进行序列化
    * 若无 为 null 则进行序列化
    */
        return f.getAnnotation(GsonExclude.class) != null;
    }

    /**
     * 是否排除对应的类
  *  同时这里也可以 排除 int 类型的属性 不进行序列化
  *
     *  若不排除任何 类  直接 返回false 即可
  * @param clazz
     * @return
     */
    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return clazz == int.class;
    }
}

实体测试类

package sun.rain.amazing.gson.strategy.exclude;

import com.google.gson.annotations.SerializedName;
import com.google.gson.annotations.Since;
import com.google.gson.annotations.Until;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @GsonExclude 在序列化时 要比  @Expose 这个注解 好用
 * ,无需每个属性都加 , 只需在排除的属性加即可
 *
 * @author sunRainAmazing
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GsonExcludeEntity {
    private Integer id;
    private String name;
    /**
     * 这个属性 序列化 排除
   */
    @GsonExclude
    @SerializedName("nick_name")
    private String nickName;
    /**
     * 这个属性 序列化 排除
  */
    @GsonExclude
    private Date birthday;

    private String fieldStrategy;
    /**
     * 这个属性 序列化 排除
  */
    @Since(1.0)
    @Until(1.8)
    @GsonExclude
    private double version;
    /**
     * 这个属性 序列化 排除
  */
    @Since(2.0)
    @GsonExclude
    private double ver;

    /**
     * 这个属性 序列化 排除
  */
    private int count;
}

3、测试

package sun.rain.amazing.gson.serialize;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.LongSerializationPolicy;
import org.junit.Test;
import sun.rain.amazing.gson.strategy.exclude.GsonExcludeEntity;
import sun.rain.amazing.gson.strategy.exclude.GsonExclusionStrategy;
import sun.rain.amazing.gson.strategy.field.FieldStrategy;

import java.util.Date;

/**
 * @author sunRainAmazing
 */
public class GsonExcludeEntityTest {
    /**
     * {
     *   "id": 1001,
     *   "name": "tomcat",
     *   "field.strategy": "someField"
     * }
     */
    @Test
    public void test(){
        GsonExcludeEntity u = new GsonExcludeEntity(
                1001,"tomcat","jerry",
                new Date(),"someField",
                1.2,20,110);
        Gson gson = new GsonBuilder()
                // 设置空值 -- 打印
                .serializeNulls()
                // 设置版本
                .setVersion(2.0)
                // 设置 格式输出
                .setPrettyPrinting()
                // 设置 时间输出格式
                .setDateFormat("yyyy-MM-dd")
                // 设置 自定义的属性输出名 策略 , 其优先级低于注解的形式
                .setFieldNamingStrategy(new FieldStrategy.AllUpperCaseStrategy())
                // 设置 内置的属性 命名策略 ,其优先级 低于注解的形式
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DOTS)
                // 开启 复杂的map key的 策略形式
                .enableComplexMapKeySerialization()
                // 开启 排除 不进行序列化的 属性
                .setExclusionStrategies(new GsonExclusionStrategy())
                // 设置 Long类型的数据 以String 类型 序列化
                .setLongSerializationPolicy(LongSerializationPolicy.STRING)
                                .create();
        System.out.println(gson.toJson(u));
    }


}


包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值