• java 序列化时排除指定属性


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

    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

    范例:

    private String getMessageJson(PushMessage message) {  
            List<Pattern> excludeProperties = new ArrayList<Pattern>();  
            Pattern pattern1 = Pattern.compile("description");  
            Pattern pattern2 = Pattern.compile("creator");// 创建者ID  
            Pattern pattern3 = Pattern.compile("modifier");// 修改者ID  
            Pattern pattern4 = Pattern.compile("deliverTime");//   
            Pattern pattern5 = Pattern.compile("description");//   
            Pattern pattern6 = Pattern.compile("createTime");//   
            Pattern pattern7 = Pattern.compile("modifyTime");//   
              
            excludeProperties.add(pattern1);  
            excludeProperties.add(pattern2);  
            excludeProperties.add(pattern3);  
            excludeProperties.add(pattern4);  
            excludeProperties.add(pattern5);  
            excludeProperties.add(pattern6);  
            excludeProperties.add(pattern7);  
              
            String pushJsonStr = null;  
            try {  
                PushMessage pushMessage = null;  
                try {  
                      
                    pushMessage = message.clone();  
                } catch (CloneNotSupportedException e) {  
                    logger.error("pushmessage clone failed.", e);  
                }  
                pushJsonStr = JSONUtil.serialize(pushMessage, excludeProperties,  
                        null, false, false);  
                logger.info("after struts serialize:" + pushJsonStr);  
            } catch (JSONException e) {  
                logger.error("struts serialize failed.", e);  
            }// TOOD 判断json字符串的长度是否超过了256  
            return pushJsonStr;  
        }  

     注意: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代码  
    public void test_jackson(){  
    //      Map map=new HashMap();  
    //      map.put("name", "黄威");  
            List<Student2> stus=null;  
            stus=new ArrayList<Student2>();  
            Student2 stu=new Student2();  
            stus.add(stu);  
            stu.setAddress(null);  
            ObjectMapper mapper = new ObjectMapper();  
            mapper.setSerializationInclusion(Inclusion.NON_NULL);  
            String content = null;  
            try {  
                content = mapper.writeValueAsString(stus);  
                System.out.println(content);  
            } catch (JsonGenerationException e) {  
                e.printStackTrace();  
            } catch (JsonMappingException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
              
        }  

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

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

    方式二:使用FilterProvider

    Java代码 
    @Test  
        public void test_jackson2(){  
            List<Student2> stus=null;  
            stus=new ArrayList<Student2>();  
            Student2 stu=new Student2();  
            stus.add(stu);  
            stu.setClassroom("36班");  
            ObjectMapper mapper = new ObjectMapper();  
            String content = null;  
            try {  
    //          content = mapper.writeValueAsString(stus);  
                SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("schoolNumber");  
                FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);  
               
                content = mapper.writer(filters).writeValueAsString(stu);  
                System.out.println(content);  
            } catch (JsonGenerationException e) {  
                e.printStackTrace();  
            } catch (JsonMappingException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
              
        }  

     注意:在排除属性的对象上面增加注解:@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学习笔记

  • 相关阅读:
    PHP 抽象类
    PHP使用rabbitmq发邮件简单使用
    自定义Chrome插件Vimium
    用Paint Tool SAI绘制漫画
    AutoHotkey 使用笔记
    Unity 性能
    VS2015解决非Unicode编码包含中文字段无法编译的问题
    高DPI设置时禁用显示的方法
    Excel 统计在某个区间内数值的个数
    自定义宏把Word打造成全快捷键编辑器
  • 原文地址:https://www.cnblogs.com/lxl57610/p/7582092.html
Copyright © 2020-2023  润新知