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
范例:
privateString getMessageJson(PushMessage message) {
List excludeProperties = new ArrayList();
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
returnpushJsonStr;
}
注意:Pattern.compile 的参数就是要排除的成员变量名称(即description,creator,modifier都是成员变量名称)
(2)使用Jackson
依赖的jar:jackson-mapper-lgpl-1.9.9.jar,jackson-core-lgpl-1.9.9.jar
如果使用maven,则在pom.xml中添加依赖
Xml代码
org.codehaus.jackson
jackson-mapper-lgpl
1.9.9
如何排除指定属性呢?
方式一:
先把要准备排除的属性的值设置为null
然后设置mapper的包含策略,看下面的实例:
Java代码
public voidtest_jackson(){//Map map=new HashMap();//map.put("name", "黄威");
List stus=null;
stus=new ArrayList();
Student2 stu=newStudent2();
stus.add(stu);
stu.setAddress(null);
ObjectMapper mapper= newObjectMapper();
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代码
@Testpublic voidtest_jackson2(){
List stus=null;
stus=new ArrayList();
Student2 stu=newStudent2();
stus.add(stu);
stu.setClassroom("36班");
ObjectMapper mapper= newObjectMapper();
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学习笔记