原文
将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用JSON lib能够便捷地完成这项工作。JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象。
无论出于何种原因,某些时候,我们需要对对象转为字符串的过程加以控制,最常见需求如数值格式化和日期格式化。JSON lib提供了JsonConfig对象,该对象能够深刻影响Java对象转成json字符串的行为。
增加忽略的属性
1. 第一种方式,实现JSONString接口的方法
@H_502_19@package cn.ysh.studio.test; @H_502_19@import java.io.Serializable; @H_502_19@import net.sf.json.JSONObject; @H_502_19@import net.sf.json.JSONString; /** * * @author 杨胜寒 * @date 2013-6-27 * */ @H_502_19@public class User implements JSONString,Serializable{ @H_502_19@private @H_502_19@static @H_502_19@final @H_502_19@long serialVersionUID = 1L; @H_502_19@private @H_502_19@long id; @H_502_19@private String name; @H_502_19@private String password; @H_502_19@public User(){} @H_502_19@public User(Long id,String name,String password){ @H_502_19@this.id = id; @H_502_19@this.name = name; @H_502_19@this.password = password; } @H_502_19@public User(String name,String password){ @H_502_19@this.name = name; @H_502_19@this.password = password; } @H_502_19@public @H_502_19@long getId() { @H_502_19@return id; } @H_502_19@public @H_502_19@void setId(@H_502_19@long id) { @H_502_19@this.id = id; } @H_502_19@public String getName() { @H_502_19@return name; } @H_502_19@public @H_502_19@void setName(String name) { @H_502_19@this.name = name; } @H_502_19@public String getPassword() { @H_502_19@return password; } @H_502_19@public @H_502_19@void setPassword(String password) { @H_502_19@this.password = password; } @Override @H_502_19@public String toJSONString() { //return "{\"id\":" + this.id + ",\"name\":\"" + this.name + "\",\"password\":\""+ this.password +"\"}"; //忽略敏感字段password @H_502_19@return "{\"id\":" + @H_502_19@this.id + ",\"name\":\"" + @H_502_19@this.name + "\"}"; } @H_502_19@public @H_502_19@static @H_502_19@void main(String[] args) { User user = @H_502_19@new User(12L,"JSON",68)">"json"); System.out.println(JSONObject.fromObject(user).toString()); } }
2.第二种方式,通过jsonconfig实例,对包含和需要排除的属性进行方便的添加或删除
@H_502_19@package cn.ysh.studio.test; @H_502_19@import java.io.Serializable; @H_502_19@import net.sf.json.JSONObject; @H_502_19@import net.sf.json.JSONString; @H_502_19@import net.sf.json.JsonConfig; class User { @H_502_19@private @H_502_19@long id; @H_502_19@private String name; @H_502_19@private String password; @H_502_19@public User(){} @H_502_19@public User(Long id,String password){ @H_502_19@this.name = name; @H_502_19@this.password = password; } @H_502_19@public @H_502_19@long getId() { @H_502_19@return id; } @H_502_19@public @H_502_19@void setId(@H_502_19@long id) { @H_502_19@this.id = id; } @H_502_19@public String getName() { @H_502_19@return name; } @H_502_19@public @H_502_19@void setName(String name) { @H_502_19@this.name = name; } @H_502_19@public String getPassword() { @H_502_19@return password; } @H_502_19@public @H_502_19@void setPassword(String password) { @H_502_19@this.password = password; } @H_502_19@public @H_502_19@static @H_502_19@void main(String[] args) { JsonConfig config = @H_502_19@new JsonConfig(); config.setExcludes( @H_502_19@new String[]{"password"}); User user = @H_502_19@new User("json"); System.out.println(JSONObject.fromObject(user,config).toString()); } }
属性过滤器
使用propertyFilter可以允许同时对需要排除的属性和类进行控制,这种控制还可以是双向的,也可以应用到json字符串到java对象
JsonConfig config = @H_502_19@new JsonConfig(); config.setJsonPropertyFilter(@H_502_19@new PropertyFilter() { @Override @H_502_19@public @H_502_19@boolean apply(Object source/* 属性的拥有者 */,String name /*属性名字*/,Object value/* 属性值 */) { @H_502_19@return source @H_502_19@instanceof User && "password".equalsIgnoreCase(name); } }); User user = @H_502_19@new User("json"); System.out.println(JSONObject.fromObject(user,config).toString());
相对于上面的何种方式,如下的方式或许更为简便:
JsonConfig config = @H_502_19@new JsonConfig(); config.registerPropertyExclusions(User.@H_502_19@class,@H_502_19@new String[]{"password"}); User user = @H_502_19@new User("json"); System.@H_502_19@out.println(JSONObject.fromObject(user,config).toString());
自定义JsonBeanProcessor
JsonBeanProcessor和实现JsonString很类似,返回一个代表原来目标对象的合法JSONObject
JsonConfig config = @H_502_19@new JsonConfig(); config.registerJsonBeanProcessor(User.@H_502_19@class,@H_502_19@new JsonBeanProcessor() { @Override @H_502_19@public JSONObject processBean(Object bean,JsonConfig config) { User user = (User) bean; @H_502_19@return @H_502_19@new JSONObject().element("id",user.getId()).element("name",user.getName()); } }); User user = @H_502_19@new User( 自定义JsonValueProcessor比如我们要控制JSON序列化过程中的Date对象的格式化,以及数值的格式化,JsonValueProcessor是最好的选择。
Map<String,Object> map = @H_502_19@newHashMap<String,Object>(); map.put("date",@H_502_19@new Date()); map.put("dates",Arrays.asList(@H_502_19@new Date())); JsonConfig config = @H_502_19@new JsonConfig(); config.registerJsonValueProcessor(Date.class,@H_502_19@new JsonValueProcessor() { //自定义日期格式 SimpleDateFormat simpleDateFormat = @H_502_19@new SimpleDateFormat("yyyy-MM-dd"); @Override /** * 处理单个Date对象 */ @H_502_19@public Object processObjectValue(String propertyName,Object date,JsonConfig config) { @H_502_19@return simpleDateFormat.format(date); } @Override /** * 处理数组中的Date对象 */ @H_502_19@public Object processArrayValue(Object date,JsonConfig config) { @H_502_19@return simpleDateFormat.format(date); } }); System.out.println(JSONObject.fromObject(map,254)"> 除了自定义日期格式外,还可以如法炮制,控制数值格式化、HTML内容转码等。