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学习笔记

时间: 2024-11-06 07:25:31

java 序列化时排除指定属性的相关文章

FastJson序列化时忽略特定属性

在之前的工作中,一直用jackson来处理json串转换的问题,有些时候我们经常有忽略某些属性的情况,个人比较习惯jackson的注解的方式,而且也是比较灵活的,分别提供了@JsonIgnoreProperties,@JsonIgnore等. 而FastJson中,并没有提供类似的方式,而是提供了各种filter机制来实现的,具体可以参考:https://github.com/alibaba/fastjson/wiki/%E5%AE%9A%E5%88%B6%E5%BA%8F%E5%88%97%E

Sublime Text 查找时排除指定的文件夹或文件

Sublime Text 查找时排除指定的文件夹或文件 Ctrl + Shift + F 这组快捷键可以调出 Sublime Text 的查找替换窗口,里边有一栏 Where,可以做一些高级设置: d:\dir\ , -*.css, -/*debug/* , -*.cache D:\Projects\ 表示在该目录下寻找,也可以写多个目录 *.cs 表示找 cs 后缀的文件,也可以写多个后缀 -/*Debug/* 表示排除 Debug 文件夹内的所有文件 -*.cache 表示排除 cache

7z压缩文件时排除指定的文件

分享一个7z压缩文件时排除指定文件类型的命令行,感觉很有用: 7z a -t7z d:\updateCRM.7z d:\updateCRM\*.* -r -x!*.log -x!*bak a:创建压缩文件 -t7z:7z格式 d:\updateCRM.7z 目标文件名 d:\update7z\*.* 源文件位置 -r:遍历所有子目录 -x!* 要扣除的文件类型

JSON序列化(stringify)对象时排除某些属性的两种方法

JavaScript的JSON对象本身就带有序列化和反序列化的函数,为 parse 和 stringify,我们一般使用这两个函数将JSON对象持久化. 如: var Persion = {    username: "Kris",    password: "1234567890"} alert(JSON.stringify(Persion))   //{"username":"Kris","password&qu

FastJson序列化时过滤字段(属性)的方法

FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法. 方法一.FastJson的注解 1 @JSONField(serialize = false) 2 private String name; 最便捷,直接在实体的字段上加FastJson的注解serialize = false,转JSON字符串时就不会有该字段. 方法二.JAVA关键字 1 @JSONField(name = "AGE") 2 private

GSON使用笔记(1) -- 序列化时排除字段的几种方式

http://blog.csdn.net/zxhoo/article/details/21471005 GSON是Google发布的JSON序列化/反序列化工具,非常容易使用.本文简要讨论在使用GSON将Java对象转成JSON时,如何排除某些字段. 最简单的用法 假设有下面这个类: [java] view plain copy class MyObj { public int x; public int y; public MyObj(int x, int y) { this.x = x; t

Maven deploy时排除指定的某个module

在某个module的pom.xml中添加如下配置 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> <configuration> <skip>true</skip> </configur

C# Newtonsoft.Json JObject移除属性,在序列化时忽略

原文 C# Newtonsoft.Json JObject移除属性,在序列化时忽略 一.针对 单个 对象移除属性,序列化时忽略处理 JObject实例的 Remove() 方法,可以在 指定序列化时移除属性和值 示例如下 : [csharp] view plain copy //json 序列化 JObject obj1 = JObject.FromObject(new { id = 1, name = "张三", age = 20 }); Console.WriteLine(obj1

Java序列化技术与Protobuff

前言: Java序列化是Java技术体系当中的一个重要议题,序列化的意义在于信息的交换和存储,通常会和io.持久化.rmi技术有关(eg:一些orm框架会要求持久化的对象类型实现Serializable接口). 本文将提供Java自带序列化机制和ProtoStuff的序列化(仅仅当作一种数据格式)的比较,从序列化的内容和特点来对二者进行比较. 结论:1,Java序列化对象时不需要通过属性的get set方法或其它无关序列化内部定义的方法(比如readObject,writeObject是内置的序