net.sf.json.JsonConfig 使用详解

转载 2016年09月27日 19:20:57

将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用 JSON lib 能够便捷地完成这项工作。JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象。

无论出于何种原因,某些时候,我们需要对对象转为字符串的过程加以控制,最常见需求如数值格式化和日期格式化。JSON lib提供了JsonConfig对象,该对象能够深刻影响Java对象转成json字符串的行为。

增加忽略的属性

1. 第一种方式,实现JSONString接口的方法

package cn.ysh.studio.test;

import java.io.Serializable;

import net.sf.json.JSONObject;
import net.sf.json.JSONString;

/**
 * 
 * @author 杨胜寒
 * @date 2013-6-27
 *
 */
public class User implements JSONString, Serializable{

   private static final long serialVersionUID = 1L;
   private long id;
   private String name;
   private String password;
   
   public User(){}
   
   public User(Long id, String name, String password){
      this.id = id;
      this.name = name;
      this.password = password;
   }
   
   public User(String name, String password){
      this.name = name;
      this.password = password;
   }
   
   public long getId() {
      return id;
   }

   public void setId(long id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getPassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   @Override
   public String toJSONString() {
      //return "{\"id\":" + this.id + ",\"name\":\"" + this.name + "\",\"password\":\""+ this.password +"\"}";
      //忽略敏感字段password
      return "{\"id\":" + this.id + ",\"name\":\"" + this.name + "\"}";
   }
   
   public static void main(String[] args) {
      User user = new User(12L, "JSON", "json");
      System.out.println(JSONObject.fromObject(user).toString());
   }
}

2.第二种方式,通过jsonconfig实例,对包含和需要排除的属性进行方便的添加或删除

package cn.ysh.studio.test;

import java.io.Serializable;

import net.sf.json.JSONObject;
import net.sf.json.JSONString;
import net.sf.json.JsonConfig;

/**
 * 
 * @author 杨胜寒
 * @date 2013-6-27
 *
 */
public class User {

   private long id;
   private String name;
   private String password;
   
   public User(){}
   
   public User(Long id, String name, String password){
      this.id = id;
      this.name = name;
      this.password = password;
   }
   
   public User(String name, String password){
      this.name = name;
      this.password = password;
   }
   
   public long getId() {
      return id;
   }

   public void setId(long id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getPassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   public static void main(String[] args) {
      JsonConfig config = new JsonConfig();  
      config.setExcludes( new String[]{"password"});
      User user = new User(12L, "JSON", "json");
      System.out.println(JSONObject.fromObject(user, config).toString());
   }
}

属性过滤器

使用propertyFilter可以允许同时对需要排除的属性和类进行控制,这种控制还可以是双向的,也可以应用到json字符串到java对象

JsonConfig config = new JsonConfig();  
config.setJsonPropertyFilter(new PropertyFilter() {
   
   @Override
   public boolean apply(Object source/* 属性的拥有者 */ , String name /*属性名字*/ , Object value/* 属性值 */) {
      return source instanceof User && "password".equalsIgnoreCase(name);
   }
});
User user = new User(12L, "JSON", "json");
System.out.println(JSONObject.fromObject(user, config).toString());

相对于上面的何种方式,如下的方式或许更为简便:

JsonConfig config = new JsonConfig();
config.registerPropertyExclusions(User.class, new String[]{"password"});
User user = new User(12L, "JSON", "json");
System.out.println(JSONObject.fromObject(user, config).toString());

自定义JsonBeanProcessor

JsonBeanProcessor和实现JsonString很类似,返回一个代表原来目标对象的合法JSONObject

JsonConfig config = new JsonConfig();
config.registerJsonBeanProcessor(User.class, new JsonBeanProcessor() {

   @Override
   public JSONObject processBean(Object bean, JsonConfig config) {
      User user = (User) bean;
      return new JSONObject().element("id", user.getId()).element("name", user.getName());
   }
});
User user = new User(12L, "JSON", "json");
System.out.println(JSONObject.fromObject(user, config).toString());

自定义JsonValueProcessor

比如我们要控制JSON序列化过程中的Date对象的格式化,以及数值的格式化,JsonValueProcessor是最好的选择。

Map<String, Object> map = new HashMap<String, Object>();
map.put("date", new Date());
map.put("dates", Arrays.asList(new Date()));
JsonConfig config = new JsonConfig();
config.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
   //自定义日期格式
   SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

   @Override
   /**
    * 处理单个Date对象
    */
   public Object processObjectValue(String propertyName, Object date,JsonConfig config) {
      return simpleDateFormat.format(date);
   }

   @Override
   /**
    * 处理数组中的Date对象
    */
   public Object processArrayValue(Object date, JsonConfig config) {
      return simpleDateFormat.format(date);
   }
});
System.out.println(JSONObject.fromObject(map, config).toString());

除了自定义日期格式外,还可以如法炮制,控制数值格式化、HTML内容转码等。

jsonconfig处理bean中的日期类型

Map bean = new HashMap(); bean.put("d", new Date()); List l = new ArrayList(); l.add("a"); ...
  • songxiuliang
  • songxiuliang
  • 2017-03-29 10:32:49
  • 922

JsonConfig的jsonConfig.setExcludes的用法

JsonConfig的jsonConfig.setExcludes的用法之前写一个小东西,当用JSONArray.fromObject()方法转一个对象集合时,因为对象中存在一对多的关系,一直抛出异常...
  • wangyang163wy
  • wangyang163wy
  • 2015-11-28 22:30:39
  • 4171

JsonConfig的常见的方法

(一)jsonConfig.setExcludes用法
  • finality_000
  • finality_000
  • 2014-07-02 14:46:37
  • 4411

JSON 中JsonConfig的使用

我们通常对一个Json串和java对象进行互转时,经常会有选择性的过滤掉一些属性值,而json-lib包中的JsonConfig为我们提供了这种 功能,具体实现方法有以下几种。(1)建立JsonCo...
  • laixiaonian
  • laixiaonian
  • 2010-10-20 09:36:00
  • 27148

jsonlib中jsonConfig的配置

json-lib中jsonConfig的常用配置详解
  • u012345283
  • u012345283
  • 2014-12-24 14:06:20
  • 2972

Json系列之四 揭开JsonConfig的神秘面纱 java to json

//揭开JsonConfig的神秘面纱,for bean to json JsonConfig jsonConfig = new JsonConfig(); //忽略掉bean中含后某个注...
  • harrison2010
  • harrison2010
  • 2015-02-10 15:01:42
  • 2830

使用 JsonConfig 排除 实体对象 建立在一对多的关联关系上 jsonConfig.setExcludes

JSONObject result=new JSONObject();  JsonConfig jsonConfig=new JsonConfig();  //setExcludes 他是排除 实...
  • JesseCary
  • JesseCary
  • 2017-07-15 23:09:42
  • 608

JsonConfig处理日期

JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Date.class, ...
  • huangxw000
  • huangxw000
  • 2011-12-27 17:03:42
  • 3022

json-lib之jsonConfig详细使用

JSON-lib一些使用技巧
  • xq328220454
  • xq328220454
  • 2014-09-13 23:05:26
  • 10655

Json系列之六 揭开JsonConfig的神秘面纱 总结篇

JsonConfig 里面的方法分类两种,是java to json 或者是 json to java的。但是api方法上有的时候很难看出所以大家最好有源码,这个我觉得后去的版本应该修改才是。 ...
  • harrison2010
  • harrison2010
  • 2015-02-10 15:18:03
  • 868
收藏助手
不良信息举报
您举报文章:net.sf.json.JsonConfig 使用详解
举报原因:
原因补充:

(最多只允许输入30个字)