`

GSON属性个性化定制

    博客分类:
  • java
 
阅读更多

 

时候我们不需要把实体的所有属性都导出,只想把一部分属性导出为Json.

有时候我们的实体类会随着版本的升级而修改.

有时候我们想对输出的json默认排好格式.

... ...

请看下面的例子吧:

实体类:

public enum ClientIdEnum {
    APP_GAME(1) // 1:应用中心
    , KITTYPLAY_2V(22) // 22:美化中心
    ;
    private final int value;

    private ClientIdEnum(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

 

public class AppInfo {
	
	public String name;//针对所有产品
	
	@ClientLimit(closeAll = true)
	public String extendMes ;//屏蔽所有产品
	
	@ClientLimit(open = {ClientIdEnum.KITTYPLAY_2V,ClientIdEnum.APP_GAME})
	public String pic;//只针对 美化中心/应用中心 产品
	
	@ClientLimit(close = {ClientIdEnum.APP_GAME})
	public Mes mes = new Mes();//只针对 应用中心 产品

	@Since(value = 1.3)
	public String imgs;//只针对 >=1.3 版本号的所有产品
	
	@Until(value = 1.2)
	public String banner;//只针对 <1.2 版本号的所有产品
	
	public AppInfo(){
		this.name = "应用宝";
		this.pic = "http://pic.png";
		this.imgs = "http://imgs1.png#http://imgs2.png";
		this.banner = "http://banner.png";
		this.extendMes = "备注信息";
	}
}

 

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Inherited
public @interface ClientLimit {
	/**
	 * @Title: open
	 * @Description:  定义需开放的产品,进行json转换
	 * @param @return    设定文件
	 * @return ClientIdEnum[]    返回类型
	 * @throws
	 */
	ClientIdEnum[] open() default {};
	
	/**
	 * @Title: close
	 * @Description: 定义需关闭的产品,不进行json转换
	 * @param @return    设定文件
	 * @return ClientIdEnum[]    返回类型
	 * @throws
	 */
	ClientIdEnum[] close() default {};
	
	/**
	 * @Title: closeAll
	 * @Description: 定义关闭所有产品,不进行json转换
	 * @param @return    设定文件
	 * @return boolean    返回类型
	 * @throws
	 */
	boolean closeAll() default false;
}

 

public class ClientIdExclusionStrategy implements ExclusionStrategy {

	private ClientIdEnum clientId = null;
	
	public ClientIdExclusionStrategy(ClientIdEnum clientId){
		this.clientId = clientId;
	}
	@Override
	public boolean shouldSkipField(FieldAttributes f) {
		boolean filter = false;
		
		ClientLimit clientLimit = f.getAnnotation(ClientLimit.class);
		if(clientLimit != null){
			boolean closeAll = clientLimit.closeAll();
			if(closeAll){
				filter = true;
			}else {
				ClientIdEnum[] open = clientLimit.open();
				ClientIdEnum[] close = clientLimit.close();
				if(open.length > 0){
					filter = true;
					for(ClientIdEnum clientIdEnum:open){
						if(clientId == clientIdEnum){
							filter = false;
							break;
						}
					}
				}else if (close.length > 0) {
					filter = false;
					for(ClientIdEnum clientIdEnum:close){
						if(clientId == clientIdEnum){
							filter = true;
							break;
						}
					}
				}
			}
		}
		return filter;
	}

	@Override
	public boolean shouldSkipClass(Class<?> clazz) {
		// TODO Auto-generated method stub
		return false;
	}

}

 

 

public class Test  extends TestCase{

	public void testGson(){
		AppInfo appInfo = new AppInfo();
		//注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson gson = new Gson();  
        Gson gson = new GsonBuilder()  
//        .excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性  
        .enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式  
        .serializeNulls() //若对象为null,则进行 null 转换;默认null值不进行转换
        .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式    
//        .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.  
        .setPrettyPrinting() //对json结果格式化.  
        .setVersion(1.2)    //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.  
                            //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么  
                            //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.  
        .setExclusionStrategies(new ClientIdExclusionStrategy(ClientIdEnum.APP_GAME))//自定义属性过滤器
//        .registerTypeAdapter(type, typeAdapter) //自定义适配器,对属性类型为 type类型的,进行typeAdapter转换,如时间格式化等 
        .create(); 
        System.out.println(gson.toJson(appInfo));
	}
}

 

分享到:
评论

相关推荐

    geoserver-2.16.2-vectortiles-plugin.zip

    - **可定制性增强**: 客户端可以根据需要决定如何渲染地图,包括颜色、样式、缩放级别等,提供更个性化的用户体验。 - **节省带宽**: 相比于传统的栅格瓦片,矢量瓦片占用更小的传输空间,尤其是在大范围和高分辨...

    excel生成sql语句和实体类代码生成器

    - **定制化配置**:用户可以根据实际项目需求,对生成的代码进行个性化配置,如命名规则、包路径等。 - **版本控制兼容**:生成的代码易于整合到版本控制系统(如Git),方便团队协作。 - **快速导入导出**:支持...

    转json对象jar包

    为此,开发者可以创建自定义的序列化模块(Serializer)或反序列化模块(Deserializer),并注册到JSON库中,以实现个性化的日期格式转换。 在标签"json"下,我们可以推测这个jar包是专门处理JSON相关操作的,包括...

    WeiNews.zip

    6. **个性化设置**:允许用户选择感兴趣的新闻类别,可能涉及到数据库存储用户的偏好。 这个App的开发遵循了标准的Android开发流程,利用现代开发工具和库,为用户提供了一个高效、定制化的新闻阅读体验。通过持续...

    Echarts安徽省地图案例(最新版)

    ECharts是中国百度公司开源的一款基于JavaScript的数据可视化库,它提供了...通过学习和实践这个案例,开发者可以掌握如何在项目中有效地利用ECharts绘制具有个性化显示效果的省级地图,并解决地图显示中的实际问题。

    下拉刷新上拉加载更多

    "下拉刷新上拉加载更多"是移动应用中常见的交互设计,主要应用于列表视图,让用户在顶部下拉时触发刷新操作,底部上拉时触发加载更多内容...在实际开发中,可以根据具体需求进行调整和定制,打造个性化的刷新加载组件。

    easyui java系统

    - 通过 CSS 和 JavaScript 可以对组件样式和行为进行调整,实现个性化设计。 8. **Ajax 和异步操作**: - 在 EasyUI 中,许多操作如分页、排序、筛选都是异步的,这需要对 Ajax 有深入理解。 - 使用 jQuery 的 `...

    fastjson jar包 和 api

    5. **类型转换与兼容性**:Fastjson对日期、枚举等特殊类型有良好的支持,可以自动进行类型转换,同时也支持自定义类型处理器以满足个性化需求。 6. **性能优势**:Fastjson以其高效的性能而闻名,其设计目标就是...

    基于安卓的海报自动生成app,毕业设计,登录 海报生成_源码.zip

    在这个应用中,用户可以创建、编辑并自定义个性化海报,无需专业的图形设计技能。下面我们将深入探讨这个项目可能涉及的一些核心知识点。 1. **Android应用程序开发**: - **Android Studio**:开发此应用的主要...

    xListView实现下拉刷新,上拉加载更多

    可以通过重写`setRefreshHeaderView`和`setLoadMoreFooterView`方法来设置自定义视图,实现个性化的设计。 6. **处理无更多数据的情况**: 当没有更多数据可以加载时,你需要显示一个提示,告诉用户已经加载完毕。...

    settings

    在Java编程语言中,"settings"通常指的是配置设置或应用程序的首选项,这些设置用于定制程序的行为以满足用户的个性化需求。在Java中管理这些设置有多种方式,包括使用Properties类、XML配置文件、JSON格式或者使用...

    meli-browser:Mercado Libre浏览器-挑战

    7. `gradle.properties` - 项目的属性设置,如版本号和个性化配置。 8. `settings.gradle` - 项目设置,定义模块结构。 基于以上信息,我们可以推测这个项目涉及的知识点可能包括: 1. **Kotlin编程**:掌握Kotlin...

Global site tag (gtag.js) - Google Analytics