zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    timer.Interval用法简介
    .net 未被引用的错误
    将Sql查询语句获取的数据插入到List列表里面
    .net 里面打不出来ConfigurationManager
    .net MVC框架里怎么写控件
    数据库里面几个字符类型的区别
    怎么在.net里面解析JSON文件?
    SqlCommand.ExecuteScalar()方法
    git学习笔记
    可变参数的lambda表达式
  • 原文地址:https://www.cnblogs.com/maohuidong/p/8066620.html
Copyright © 2011-2022 走看看