`

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));
	}
}

 

分享到:
评论

相关推荐

    Gson 中解决 json 反序列化时相同属性对应不同类型的值的问题(代码)

    Gson 中解决 json 反序列化时相同属性对应不同类型的值的问题(代码),对应文章链接:https://blog.csdn.net/ZiFung_Yip/article/details/89143255

    google gson包json格式化

    gson google json格式化所需要依赖的jar包,可对数据格式化输出

    Gson解析之自定义序列化和反序列化

    Gson解析之自定义序列化和反序列化的代码例子,但后端对同一个字段给的数据类型与文档不一致时的处理

    GSON JAR包 最新包和历史包 gson-2.10.1

    介绍:Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. 压缩包里有以下文件: ...

    om.google.gson.Gson Gson maven依赖

    om.google.code.gson/gson/2.6.2 Gson maven依赖 java 开发包

    Google gson

    Google gson库能够实现定制化的序列化和反序列操作,能够简化Java序列化和反序列化操作

    Gson 枚举类型的统一序列化/反序列化处理

    实现了通过gson对enum的自定义转化过程,不需要预先定义enmu,并且不需要修改gson源码,在框架顶层处理基本可以达到对enum的抽象管理。

    gson-2.8.5版本的jar包

    可以将一个JSON字符串转成一个Java对象(反序列化),或者反过来(序列化)。 GSON地址:google/gson (github.com) Android引入GSON: implementation ‘com.google.code.gson:gson:2.9.0’ Gson 是 Google 提供的...

    gson jar包下载

    gson jar包 gson jar包下载 gson jar包下载 gson jar包下载

    gson 使用Gson将Java对象转换为JSON

    3. 将Java对象的属性转换成指定的JSON名字 Java 代码 收藏代码 1. import com.google.gson.FieldNamingPolicy; 2. import com.google.gson.Gson; 3. import com.google.gson.GsonBuilder; 4. import ...

    gson-2.8.0-API文档-中文版.zip

    赠送jar包:gson-2.8.0.jar; 赠送原API文档:gson-2.8.0-javadoc.jar; 赠送源代码:gson-2.8.0-sources.jar; 赠送Maven依赖信息文件:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    com.google.gson.Gson 2.8.1 2.8.2 jar包 gson

    com.google.gson.Gson 2.8.1 2.8.2 jar包 gson,直接解压到maven仓库,或者提取里面的jar包都可以使用

    com.google.gson.Gson.jar

    json我们在网络请求中经常用到,最近最火的微信小程序开发中... 就会报错,因为对于嵌套类型的json它是解释不出来的,这时就需要用到com.google.gson.Gson.jar了。资源中提供了jar包与代码示例,一句代码解决您的问题。

    gson-2.8.6-API文档-中文版.zip

    赠送jar包:gson-2.8.6.jar; 赠送原API文档:gson-2.8.6-javadoc.jar; 赠送源代码:gson-2.8.6-sources.jar; 赠送Maven依赖信息文件:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    gson-2.8.7-API文档-中文版.zip

    赠送jar包:gson-2.8.7.jar; 赠送原API文档:gson-2.8.7-javadoc.jar; 赠送源代码:gson-2.8.7-sources.jar; 赠送Maven依赖信息文件:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    googleGson JsonObject json转换包

    包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class ...

    fastjson、gson、jackson序列化和反序列化所用 json

    fastjson、gson、jackson序列化和反序列化所用json文件

    com.google.gson.Gson 2.8.5 jar包

    截止至2018-11-27,github上com.google.gson.Gson 最新的2.8.5jar包。强大的json字符串解析功能及将字符串转换为json格式。我16年上传的免费下载的2.8.0版本不知道为什么变成下载需要50分了

    gson-2.8.9-API文档-中文版.zip

    赠送jar包:gson-2.8.9.jar; 赠送原API文档:gson-2.8.9-javadoc.jar; 赠送源代码:gson-2.8.9-sources.jar; 赠送Maven依赖信息文件:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    fastJosn Gson Jackson 序列化和反序列化所需要的jarlib.rar

    fastJosn Gson Jackson 序列化和反序列化所需要的jar,已经全部验证过,请放心使用咯

Global site tag (gtag.js) - Google Analytics