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
范例:
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中添加依赖
<!-- Json转化模块 --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-lgpl</artifactId> <version>1.9.9</version> </dependency>
如何排除指定属性呢?
方式一:
先把要准备排除的属性的值设置为null
然后设置mapper的包含策略,看下面的实例:
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
@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学习笔记
相关推荐
标题中的“jackson库实现定制化的java序列化反序列化操作”指的是利用Jackson库的能力,通过自定义规则来控制对象的序列化和反序列化过程。这通常涉及到创建自定义的`JsonSerializer`和`JsonDeserializer`,或者使用...
- **精简对象属性**:只序列化必要的字段,不必要的属性可以通过transient关键字排除。 2. **使用FastSerializable接口**: - Java的标准序列化机制虽然方便,但效率较低。可以自定义实现序列化接口,如使用Kryo...
然而,在序列化 Apache Avro 对象时,可能会遇到一些问题,例如序列化 Apache Avro 对象的 Schema 属性时抛出异常。 问题的根源在于 Apache Avro 对象的 Schema 属性中含有一个 getSchema() 方法,该方法返回一个 ...
- **排除不需要序列化的成员**:使用`[XmlIgnore]`特性来排除某个成员。 - **强制指定成员的序列化顺序**:使用`[XmlElement(Order = n)]`特性来控制成员的序列化顺序。 - **自定义序列化行为**:通过实现`...
该接口包含一个`getEraseType`方法,用于返回一个类型标识,以便在擦除属性时根据这个类型查找相应的规则。 ```java // Eraseable.java public interface Eraseable { String getEraseType(); } ``` 接下来,我们...
以上方案的优点在于,通过注解和AOP,我们可以将数据序列化的逻辑封装起来,使得业务代码更简洁,同时可以根据不同的场景动态地调整需要序列化的属性,提高了代码的可维护性和灵活性。 总结来说,本方案的核心是...
Java对象序列化是将程序中的对象转换为可存储或传输的形式的过程。这通常涉及到将对象的状态转换为一种标准格式,如JSON(JavaScript Object Notation)或XML(eXtensible Markup Language)。这两种格式广泛用于...
比如,`@JsonProperty`用于指定哪个字段应该被序列化或反序列化,`@JsonIgnore`用于忽略某个属性,`@JsonInclude`和`@JsonExclude`用于控制序列化时哪些属性应该包含或排除,还有`@JsonFormat`可以指定日期和时间的...
然后,通过`@JsonFilter`注解在你的Java类或者属性上声明这个过滤器,这样Jackson在序列化时就会应用这些规则。 举个例子,假设我们有一个`User`类,其中包含`name`、`email`和`password`等字段,我们可能不希望在...
- `@JsonProperty`:标记类的属性,使其在序列化和反序列化时被处理。 - `@JsonIgnore`:排除某个属性,不让其出现在JSON中。 - `@JsonInclude`:指定哪些字段应被包含,哪些不应被包含。 - `@JsonAutoDetect`:...
4. `@JsonInclude`: 控制在序列化时哪些属性应该被包含,例如可以排除null值。 5. `@JsonFormat`: 用于规定日期、时间等值的格式化方式。 6. `@JsonTypeInfo` 和 `@JsonSubTypes`: 用于处理多态类型序列化和反序列...
在类上使用`@JsonProperty`注解指定JSON字段对应的Java属性,`@JsonIgnore`注解排除不需要映射的属性。 ```java public class YourJavaClass { @JsonProperty("jsonField") private String javaField; // ...
例如,`@JsonProperty`用于指定字段与JSON键的对应关系,`@JsonInclude`用于控制哪些属性应该包含在序列化的JSON中,`@JsonIgnore`则可以排除某些属性不参与序列化或反序列化等。 2. **Jackson-Core-2.7.4**: 核心...
例如,`@JsonProperty`用于指定哪个字段应该被序列化或反序列化,`@JsonIgnore`用于忽略特定字段,`@JsonInclude`和`@JsonExclude`用于控制哪些属性应该在序列化时包含或排除,还有`@JsonAutoDetect`用于定义字段、...
例如,`@JsonProperty`用于指定一个字段与JSON属性的映射,`@JsonIgnore`用于忽略某个字段,`@JsonInclude`和`@JsonExclude`用于控制序列化时哪些属性应被包含或排除,等等。 4. **jackson-modules-java8.jar**: 这...
例如,`@JsonIgnore`可以忽略某个属性,`@JsonInclude`和`@JsonExclude`用于控制序列化时哪些属性应被包含或排除,`@JsonFormat`可以指定日期或时间的格式等。 在压缩包中的"META-INF"目录通常包含了关于库的信息,...
比如,`@JsonProperty`用于指定哪个字段应被序列化或反序列化,`@JsonIgnore`用于忽略某个字段,`@JsonInclude`和`@JsonExclude`控制序列化时哪些属性应该被包含或排除。 4. **类型转换**: Jackson支持多种复杂类型...
例如,`@JsonProperty`用于指定属性与JSON字段的映射,`@JsonInclude`用于控制哪些属性应该被包括在序列化过程中,`@JsonIgnore`则用于排除某些属性不参与序列化和反序列化。 2. **Jackson-Core-2.9.9.jar**:...
5. **@JsonInclude** 和 **@JsonExclude**: 控制序列化时哪些属性应包含或排除,提供了更细粒度的控制。 6. **Jackson Modules**: Jackson生态系统允许扩展,通过添加模块可以支持更多的数据格式和功能,如Joda-Time...