java 序列化时排除指定属性

简介:

Java 序列化对象如何排除指定属性呢?

java 中序列化对象有多种方式:struts2 ,jackson,json-lib

(1)使用struts2 json插件

依赖的jar包:struts2-json-plugin-2.3.15.3.jar,xwork-core-2.3.15.3.jar,当然还有servlet-api.jar

范例:

Java代码   收藏代码
  1. private String getMessageJson(PushMessage message) {  
  2.         List<Pattern> excludeProperties = new ArrayList<Pattern>();  
  3.         Pattern pattern1 = Pattern.compile("description");  
  4.         Pattern pattern2 = Pattern.compile("creator");// 创建者ID  
  5.         Pattern pattern3 = Pattern.compile("modifier");// 修改者ID  
  6.         Pattern pattern4 = Pattern.compile("deliverTime");//   
  7.         Pattern pattern5 = Pattern.compile("description");//   
  8.         Pattern pattern6 = Pattern.compile("createTime");//   
  9.         Pattern pattern7 = Pattern.compile("modifyTime");//   
  10.           
  11.         excludeProperties.add(pattern1);  
  12.         excludeProperties.add(pattern2);  
  13.         excludeProperties.add(pattern3);  
  14.         excludeProperties.add(pattern4);  
  15.         excludeProperties.add(pattern5);  
  16.         excludeProperties.add(pattern6);  
  17.         excludeProperties.add(pattern7);  
  18.           
  19.         String pushJsonStr = null;  
  20.         try {  
  21.             PushMessage pushMessage = null;  
  22.             try {  
  23.                   
  24.                 pushMessage = message.clone();  
  25.             } catch (CloneNotSupportedException e) {  
  26.                 logger.error("pushmessage clone failed.", e);  
  27.             }  
  28.             pushJsonStr = JSONUtil.serialize(pushMessage, excludeProperties,  
  29.                     null, false, false);  
  30.             logger.info("after struts serialize:" + pushJsonStr);  
  31.         } catch (JSONException e) {  
  32.             logger.error("struts serialize failed.", e);  
  33.         }// TOOD 判断json字符串的长度是否超过了256  
  34.         return pushJsonStr;  
  35.     }  

 注意:Pattern.compile 的参数就是要排除的成员变量名称(即description,creator,modifier都是成员变量名称)

 

 

(2)使用Jackson

官网:http://jackson.codehaus.org/

参考:http://blog.csdn.net/sciurid/article/details/8624107

 

http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html

依赖的jar:jackson-mapper-lgpl-1.9.9.jar,jackson-core-lgpl-1.9.9.jar

如果使用maven,则在pom.xml中添加依赖

 

Xml代码   收藏代码
  1. <!-- Json转化模块 -->  
  2.         <dependency>  
  3.             <groupId>org.codehaus.jackson</groupId>  
  4.             <artifactId>jackson-mapper-lgpl</artifactId>  
  5.             <version>1.9.9</version>  
  6.         </dependency>  

 如何排除指定属性呢?

 

方式一:

先把要准备排除的属性的值设置为null

然后设置mapper的包含策略,看下面的实例:

 

Java代码   收藏代码
  1. public void test_jackson(){  
  2. //      Map map=new HashMap();  
  3. //      map.put("name", "黄威");  
  4.         List<Student2> stus=null;  
  5.         stus=new ArrayList<Student2>();  
  6.         Student2 stu=new Student2();  
  7.         stus.add(stu);  
  8.         stu.setAddress(null);  
  9.         ObjectMapper mapper = new ObjectMapper();  
  10.         mapper.setSerializationInclusion(Inclusion.NON_NULL);  
  11.         String content = null;  
  12.         try {  
  13.             content = mapper.writeValueAsString(stus);  
  14.             System.out.println(content);  
  15.         } catch (JsonGenerationException e) {  
  16.             e.printStackTrace();  
  17.         } catch (JsonMappingException e) {  
  18.             e.printStackTrace();  
  19.         } catch (IOException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.           
  23.     }  

 我把Student2对象的属性address设置为null,那么序列化时就会排除address属性.

 

注意:mapper.setSerializationInclusion(Inclusion.NON_NULL); 表示排除值为null的属性(成员变量)

方式二:使用FilterProvider

 

Java代码   收藏代码
  1. @Test  
  2.     public void test_jackson2(){  
  3.         List<Student2> stus=null;  
  4.         stus=new ArrayList<Student2>();  
  5.         Student2 stu=new Student2();  
  6.         stus.add(stu);  
  7.         stu.setClassroom("36班");  
  8.         ObjectMapper mapper = new ObjectMapper();  
  9.         String content = null;  
  10.         try {  
  11. //          content = mapper.writeValueAsString(stus);  
  12.             SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("schoolNumber");  
  13.             FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);  
  14.            
  15.             content = mapper.writer(filters).writeValueAsString(stu);  
  16.             System.out.println(content);  
  17.         } catch (JsonGenerationException e) {  
  18.             e.printStackTrace();  
  19.         } catch (JsonMappingException e) {  
  20.             e.printStackTrace();  
  21.         } catch (IOException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.           
  25.     }  

 注意:在排除属性的对象上面增加注解:@JsonFilter("myFilter")

参考:
http://www.baeldung.com/jackson-ignore-properties-on-serialization 

 

http://stackoverflow.com/questions/11757487/how-to-tell-jackson-to-ignore-a-field-during-serialization-if-its-value-is-null

http://www.cnblogs.com/yangy608/p/3936848.html

相关文章
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
650 1
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
574 1
|
JSON Java 数据库连接
|
存储 安全 Java
深入理解Java序列化接口及其实现机制
记住,序列化不仅仅是把对象状态保存下来那么简单,它涉及到类的版本控制、安全性和性能等多个重要方面。正确理解和实现Java序列化机制对于构建高效、安全和可维护的Java应用至关重要。
435 0
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
17129 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
JSON 前端开发 JavaScript
Java属性为什么不能是is开头的boolean
在Java实体类中,阿里规约要求boolean属性不应以is开头。文章通过实际案例分析了isUpdate字段在JSON序列化过程中变为update的问题,并提供了自定义get方法或使用@JSONField注解两种解决方案,建议遵循规约避免此类问题。
804 0
Java属性为什么不能是is开头的boolean
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
517 5
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
430 3

热门文章

最新文章