`
zhanshi258
  • 浏览: 47340 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

选择性将对象的属性转换为Json

    博客分类:
  • Java
 
阅读更多

上一篇写的Json转换项目中大部分情况都已经够用了,但是,有时候一个对象很多属性,而我们并不需要那么多,那么就选择性的过滤掉一些属性喽。

还有对于日期这样的属性,我们该让它以何种格式显示呢? 这也是我们需要考虑的问题。

下面请看实例:

实体类Student.java 

 

public class Student {

	@Include("tt")
	private String userName;
	
	@Exclude("tt")
	private int age;
	
	@Include("tt")
	private Date birthDay;
	
	private List<String> hobbiy;
	
	/////////////////get/set方法已经省略/////////////////////////
}

 

 

我们采用注解的方式,在实体类上加上一个注解,加了注解的表示要转换成Json的,没加的则不转换,而且可以灵活的控制。

 

注解类:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Include {
	String[] value() default "";
}

 

转换类:

public class JsonInclude {
	private static Map<String,List<String>> classfields=new HashMap<String,List<String>>();
	private JsonInclude() {
	}
/**
 * 
 * @param obj
 * @param includeTag 只将Include标签中包含此字符串的field转换成json 为null时将不过滤
 * @return
 */
	public static Object json(Object obj, String includeTag) {
		try {
			if (null != obj) {
				JsonConfig jsonConfig=null;
				if(StringUtils.isEmpty(includeTag))
					jsonConfig=getJsonConfig();
				else
					jsonConfig=getJsonConfig(includeTag);
				jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());  
				if (obj instanceof List ) {
					return JSONArray.fromObject(obj, jsonConfig);
				} else {
					return JSONObject.fromObject(obj, jsonConfig);
				}
			}
			return obj;
		} catch (Exception e) {
			System.out.println("json failed " + includeTag);
			System.out.println(e.getLocalizedMessage());
			System.out.println(e);
		}
		return obj;
	}

	private static JsonConfig getJsonConfig(final String includeTag) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	if(value == null){
            		return true;
            	}else{
        			Class<?> objClass=obj.getClass();
        			Class<?> tempClass=obj.getClass();
        			List<String> fields=classfields.get(objClass.getName()+includeTag);
        			if(CollectionUtils.isEmpty(fields)){
        				fields=new ArrayList<String>();
        				while(objClass!=null){
            				Field[] fieldss=objClass.getDeclaredFields();
            				for(Field f:fieldss){
            					if(f.isAnnotationPresent(Include.class)){
            						String[] tag = f.getAnnotation(Include.class).value();
            						for (String str : tag) {
            							if (str.equals(includeTag)) {
            								fields.add(f.getName());
            								break;
            							}
            						}
            					}
            				}
            				objClass=objClass.getSuperclass();
            			}
        				classfields.put(tempClass.getName()+includeTag, fields);
        			}
    				for(String ff:fields){
    					if(ff.equals(name)){
    						return false;
    					}
    				}
        			return true;
            	}
            }
        });
		return jsonConfig;
	}
	private static JsonConfig getJsonConfig() {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	return null==value;
            }
        });
		return jsonConfig;
	}
}

 

这里面用到了日期格式转换的类,等最后面会贴出来。

现在就可以看测试类了:

public class IncludeTest {

	//所有属性都会转换
	public void objectNoTag(){
		Student s = new Student();
		s.setAge(45);
		s.setBirthDay(new Date());
		List<String> hobbiy = new ArrayList<String>();
		hobbiy.add("唱歌");hobbiy.add("跳舞");hobbiy.add("爬山");
		s.setHobbiy(hobbiy);
		s.setUserName("张三");
		
		System.out.println(JsonInclude.json(s, null));
	}
	
	//现在只有属性上加有@Include("tt")注解的才会转换了
	public void objectTag(){
		Student s = new Student();
		s.setAge(45);
		s.setBirthDay(new Date());
		List<String> hobbiy = new ArrayList<String>();
		hobbiy.add("唱歌");hobbiy.add("跳舞");hobbiy.add("爬山");
		s.setHobbiy(hobbiy);
		s.setUserName("张三");
		
		System.out.println(JsonInclude.json(s, "tt"));
	}
	
	public static void main(String[] args) {
		IncludeTest inc = new IncludeTest();
		inc.objectNoTag();
		inc.objectTag();
	}
	

 

日期转换类:

public class JsonDateValueProcessor implements JsonValueProcessor {
	
	public JsonDateValueProcessor() {
		super();
	}
	
	public JsonDateValueProcessor(String format) {
		super();
	}

	@Override
	public Object processArrayValue(Object paramObject,
			JsonConfig paramJsonConfig) {
		return process(paramObject);
	}

	@Override
	public Object processObjectValue(String paramString, Object paramObject,
			JsonConfig paramJsonConfig) {
		return process(paramObject);
	}
	
	
	private Object process(Object value){
        if(value instanceof Date){  
            return ((Date) value).getTime();
        }  
        return value == null ? "" : value.toString();  
    }

}

 

可能会有人觉得如果我只想去掉某一个属性,那你不会让我把剩下的属性全加你那个注解吧? 当然不会。

我们可以再写一个嘛

注解类:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Exclude {
	String[] value() default "";
}

 

转换类:

public class JsonExclude {
	
	private static Map<String,List<String>> classfields=new HashMap<String,List<String>>();
	private JsonExclude() {}
	
	/**
	 * 
	 * @param obj
	 * @param excludeTag 将过滤Exclude标签中包含此字符串的field的属 ?为null时将不过滤
	 * @return
	 */
	public static Object json(Object obj, String excludeTag) {
		try {
			if (null != obj) {
				JsonConfig jsonConfig=null;
				if(StringUtils.isEmpty(excludeTag))
					jsonConfig=getJsonConfig();
				else
					jsonConfig=getJsonConfig(excludeTag);
				jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
				if (obj instanceof List) {
					return JSONArray.fromObject(obj, jsonConfig);
				} else {
					return JSONObject.fromObject(obj, jsonConfig);
				}
			}
			return obj;
		} catch (Exception e) {
			System.out.println("json failed . excludeTag={},msg={}" + excludeTag + e.getLocalizedMessage() + e);
		}
		return obj;
	}

	private static JsonConfig getJsonConfig(final String excludeTag) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	if(value == null){
            		return true;
            	}else{
        			Class<?> objClass=obj.getClass();
        			Class<?> tempClass=obj.getClass();
        			List<String> fields=classfields.get(objClass.getName()+excludeTag);
        			if(CollectionUtils.isEmpty(fields)){
        				fields=new ArrayList<String>();
        				while(objClass!=null){
            				Field[] fieldss=objClass.getDeclaredFields();
            				for(Field f:fieldss){
            					if(f.isAnnotationPresent(Exclude.class)){
            						String[] tag = f.getAnnotation(Exclude.class).value();
            						for (String str : tag) {
            							if (str.equals(excludeTag)) {
            								fields.add(f.getName());
            								break;
            							}
            						}
            					}
            				}
            				objClass=objClass.getSuperclass();
            			}
        				classfields.put(tempClass.getName()+excludeTag, fields);
        			}
    				for(String ff:fields){
    					if(ff.equals(name)){
    						return true;
    					}
    				}
        			return false;
            	}
            }
        });
		return jsonConfig;
	}
	private static JsonConfig getJsonConfig() {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	return null==value;
            }
        });
		return jsonConfig;
	}
}

 

测试:

public class ExcludeTest {

	public void listTag(){
		Student s0 = new Student();
		s0.setAge(45);
		s0.setBirthDay(new Date());
		List<String> hobbiy0 = new ArrayList<String>();
		hobbiy0.add("唱歌");hobbiy0.add("跳舞");hobbiy0.add("爬山");
		s0.setHobbiy(hobbiy0);
		s0.setUserName("张三");
		
		Student s1 = new Student();
		s1.setAge(35);
		s1.setBirthDay(new Date());
		List<String> hobbiy1 = new ArrayList<String>();
		hobbiy1.add("唱歌1");hobbiy1.add("跳舞1");hobbiy1.add("爬山1");
		s1.setHobbiy(hobbiy1);
		s1.setUserName("李四");
		
		Student s2 = new Student();
		s2.setAge(25);
		s2.setBirthDay(new Date());
		List<String> hobbiy2 = new ArrayList<String>();
		hobbiy2.add("唱歌2");hobbiy2.add("跳舞2");hobbiy2.add("爬山2");
		s2.setHobbiy(hobbiy2);
		s2.setUserName("王五");
		List<Student> list = new ArrayList<Student>();
		
		list.add(s0);list.add(s1);list.add(s2);
		
		System.out.println(JsonExclude.json(list, "tt"));
	}
	
	
	public static void main(String[] args) {
		ExcludeTest exc = new ExcludeTest();
		exc.listTag();
	}

 

分享到:
评论

相关推荐

    json的介绍 以及 json2.js的用法

    为了将JSON文本转换为对象,可以使用eval&#40;&#41;函数。eval&#40;&#41;函数调用JavaScript编辑器。由于 JSON是JavaScript的子集,因此编译器将正确的解析文本并产生对象结构。文本必须括在括号中避免 产生...

    domJSON:尽快将DOM树转换为紧凑的JSON对象,反之亦然

    尽快将DOM树转换为紧凑的JSON对象,反之亦然。 跳到 贡献 执照 描述 domJSON的目的是创建DOM作为JSON的非常准确的表示形式,并非常快地完成它。 尽管该项目可能有数十个可行的用例,但我进行了两个快速演示,以...

    js JSON.stringify()基础详解

    JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,如果指定了replacer是一个函数,则可以选择性的替换值,或者如果指定了replacer是一个数组,可选择性的仅包含数组指定的属性。...

    JavaScript详解(第2版)

     13.7.3 使用事件对象属性   13.7.4 将事件传递给JavaScript函数   13.7.5 鼠标坐标   13.7.6 按键事件   13.8 处理事件的脚本模型   13.9 应知应会   练习   第14章 CSS与JavaScript   ...

    JQuery权威指南源代码

    使用jQuery表单对象属性过滤选择器 使用jQuery表单过滤选择器 第3章 DOM树状文档 获取元素的属性 设置元素的属性 设置元素的属性 获取或设置元素的内容 获取或设置元素的值 直接设置元素样式值 增加CSS类别...

    sensors:用于存储传感器和传感器读数的 jerseygrizzlycollection+json 示例

    选择域是为了简单起见,还因为它强调了不要将域对象直接公开为 REST 资源的必要性。 在这种特殊情况下,当我们公开传感器时,我们还希望在同一资源中获得它的最新读数。 讨论 不确定处理从服务/数据库到集合+json ...

    JSONPath:来自http的JSONPath分支

    分析,转换和选择性地从JSON文档(和JavaScript对象)提取数据。 jsonpath-plus在原始规范的基础上进行了扩展,以添加一些其他运算符,并明确显示了原始规范没有阐明的某些行为。 尝试或 。 特征 符合原始的...

    jQuery权威指南366页完整版pdf和源码打包

    2.2.5 可见性过滤选择器 2.2.6 属性过滤选择器 2.2.7 子元素过滤选择器 2.2.8 表单对象属性过滤选择器 2.2.9 表单选择器 2.3 综合案例分析—导航条在项目中的应用 2.3.1 需求分析 2.3.2 效果界面 ...

    jquery-1.1.3 效率提高800%

    选择器速度提升 选择器的速度大幅度提高了,下表为jQuery1.1.2和1.1.3的选择器速度对比,提高了8倍多 Browser jQuery 1.1.2 jQuery 1.1.3 % Improvement IE 6 4890ms 661ms 740% Firefox 2 5629ms 567...

    ActionScript开发人员指南中文版

    几何形状示例:对显示对象应用矩阵转换 第章:使用绘图API 绘制API的基础 Graphics类 绘制线条和曲线 使用内置方法绘制形状 创建渐变线条和填充 将Math类与绘制方法配合使用 使用绘图API进行动画处理 绘制API示例:...

    jQuery权威指南-源代码

    2.2.8 表单对象属性过滤选择器/32 2.2.9 表单选择器/34 2.3 综合案例分析—导航条在项目中的应用/37 2.3.1 需求分析/37 2.3.2 效果界面/38 2.3.3 功能实现/38 2.3.4 代码分析/40 2.4 本章小结/41 第3章 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 对象与实例属性补充 08 面向对象作业 第25章 01 上节课回顾 02 静态属性 03 类方法 04 静态方法 05 小结 06 组合 07 继承 08 接口继承与归一化设计 09 继承顺序之mro线性顺序列表 10 在python2中的继承顺序是...

    Ajax详解.rar

    Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本系列的作者是一位 Ajax 专家,他演示了这些技术如何协同工作 —— 从总体概述到细节的...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -将所有的示例转化为英语版本。 -修正Tree控件的一个BUG(定义Mappings属性时)。 +PageManager.Instance应该存在于HttpContext.Current,而不是一个全局变量。 -这个BUG导致Asp.net compatibility中的示例无法...

    Struts2 in action中文版

    3.4.1 对象支持的JavaBean属性 52 3.4.2 ModelDriven动作 54 3.4.3 域对象用作数据转移的潜在危险 55 3.5 案例研究:文件上传 56 3.5.1 通过struts-default包获得内建的支持 56 3.5.2 fileUpload拦截器做什么 57 ...

    ExtAspNet_v2.3.2_dll

    -将所有的示例转化为英语版本。 -修正Tree控件的一个BUG(定义Mappings属性时)。 +PageManager.Instance应该存在于HttpContext.Current,而不是一个全局变量。 -这个BUG导致Asp.net compatibility中的示例无法...

    超实用的jQuery代码段

    超实用的jQuery代码段精选近350个jQuery代码段,涵盖页面开发中绝大多数要点、技巧与方法,堪称史上最实用的jQuery代码参考书,可以视为网页设计与网站建设人员的好帮手。《超实用的jQuery代码段》的代码跨平台、跨...

    JavaScript实战

    11.4.2 复杂的JSON对象 354 第12章 Ajax编程基础 357 12.1 Tabs插件 357 12.1.1 改变正在加载文本和图标 359 12.1.2 Ajax标签页教程 361 12.2 向站点添加Google地图 364 12.2.1 为地图设定位置 366 12.2.2 其他jMaps...

Global site tag (gtag.js) - Google Analytics