java 序列化时排除指定属性

摘要:
Patternpattern2=模式。编译(“创建者”);//创建者IDPatternpattern3=模式。compile(“modifier”)//Patternpattern5=模式。编译(“描述”);//excludeProperties.add(pattern1);

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")
java 序列化时排除指定属性第1张

参考: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 序列化时排除指定属性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android ico在Spring+maven项目中配置数据库连接池Druid下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于BindingSource的WinForm开发

1.引言 BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用。使用这些API我们可以将Code与各种具体类型数据源进行解耦;使用这些Event我们可以洞察数据的变化。 2.简单绑定 DataTable myTable = myTableAdapter.GetData();//创建Table Binding...

lambda表达式封装对数据库的查询

前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询,当数据多和用户量多时,查询的效率会降低。 1.2.在写查询where条件的时候,总是用string.format去拼接字符串,开发效率低。 1.3.代码不够优...

Jackson的高级应用(转)

Jackson 是当前用的比较广泛的,用来序列化和反序列化 JSON 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 JSON 解析器之一 。 Spring MVC 的默认 JSON 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖...

Ftp进行文件的上传和下载

一、开篇之前,先给大家推荐一款好用的FTP工具:FTP客户端—IIs7服务器管理工具             --官网地址:http://fwqglgj.iis7.net/cp/ftp/?cmc-zc作为FTP客户端,它支持批量管理ftp站点。定时上传和定时下载,定时备份,且操作简洁。同时iis7服务器管理工具还是vnc客户端。并且支持批量管理管理wind...

Android学习笔记12:图像渲染(Shader)

在Android中,提供了Shader类专门用来渲染图像以及一些几何图形。   Shader类包括了5个直接子类,分别为:BitmapShader、ComposeShader、LinearGradient、RadialGradient以及SweepGradient。其中,BitmapShader用于图像渲染;ComposeShader用于混合渲染;Line...

Spring源码分析:类型转换(一)之PropertyEditor和ConversionService

引子 创建Person类: @Data @Component public class Person { @Value("wj") private String name; @Value("20") private Integer age; @Value("2020/10/10 12:30:30") private Date birth;...