json-lib的一些过滤操作
阅读原文时间:2023年07月09日阅读:3

package demo4;

import java.io.Serializable;

import net.sf.json.JSONString;

public class User implements JSONString,Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private long id;
private String name;
private String 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 User(long id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}

public User() {  
    super();  
}

public String toJSONString() {  
    return "{\\"id\\":"+this.id+",\\"name\\":\\""+this.name+"\\"}";  
}

}

user.java

package demo4;

public class Teacher {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int 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 Teacher(int id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
public Teacher() {
super();
}

}

Teacher.java

package demo4;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonBeanProcessor;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.PropertyFilter;

import org.junit.Test;

public class Demo {
/*

public void registerJsonBeanProcessor(Class target,  
                                  JsonBeanProcessor jsonBeanProcessor)

Registers a JsonBeanProcessor.  
\[Java -> JSON\]

Parameters:  
    target - the class to use as key  
    jsonBeanProcessor - the processor to register

public void registerPropertyExclusion(Class target,    \*注册不转换的属性在类中 \*  
                                  String propertyName)

Registers a exclusion for a target class.  
\[Java -> JSON\]

Parameters:  
    target - the class to use as key  
    propertyName - the property to be excluded

public void setExcludes(String\[\] excludes)  设置不转换的属性  
    Sets the excludes to use.  
    Will set default value (\[\]) if null.  
    \[Java -> JSON\] 

PropertyFilter: 属性过滤器  
    一个方法:  
     apply

boolean apply(Object source,  
          String name,  
          Object value)

Parameters:  
    source - the owner of the property  
    name - the name of the property  
    value - the value of the property  
Returns:  
    true if the property will be filtered out, false otherwise

 \*/

/\*\*  
 \* 忽略不必要属性重写该对象指定toJSONString方法测试  
 \*/  
@Test  
public void fun(){  
    User user=new User(12,"郭大侠","gz1234");  
    JSONObject jo=JSONObject.fromObject(user);  
    System.out.println(jo);  
}

/\*\*  
 \* 忽略不必要的属性,使用jsonConfig实现  
 \* 通过jsonconfig实例,对包含和需要排除的属性进行方便的添加或删除  
 \*/  
@Test  
public void fun1(){  
    Teacher t=new Teacher(12,"guodaxia","gz1234");  
    JsonConfig config=new JsonConfig();  
    config.setExcludes(new String\[\]{"password"});//设置排除password属性  
    JSONObject jo=JSONObject.fromObject(t, config);  
    System.out.println(jo);  
}

/\*\*  
 \* 测试使用属性过滤器达到前面的效果  
 \* 使用propertyFilter可以允许同时对需要排除的属性和类进行控制,这种控制还可以是双向的,也可以应用到json字符串到java对象  
 \*/  
@Test  
public void fun2(){  
    Teacher t=new Teacher(12,"guodaxia","gz1234");  
    JsonConfig config=new JsonConfig();  
    config.setJsonPropertyFilter(new PropertyFilter() {

        public boolean apply(Object source, String propertyName, Object value) {  
            /\*\*  
             \* 就这样将Teacher类中的password属性过滤掉了  
             \*/  

// return source instanceof Teacher && "password".equalsIgnoreCase(propertyName);
return "password".equalsIgnoreCase(propertyName);//这个是测试它可以双向过滤
}

    });  
    JSONObject jo=JSONObject.fromObject(t, config);  
    System.out.println(jo);  
    JSONObject jo1=(JSONObject) JSONSerializer.toJSON("{'id':12,'name':'gz','password':'a12345'}", config);//这里使用JSONSerializer得到的JSON对象才有效可转换为Teacher对象,JSONObject.fromObject不行,不知为何  
    Teacher tt=(Teacher) jo1.toBean(jo1, Teacher.class );  
    System.out.println(tt.getId()+"--"+tt.getName()+"--"+tt.getPassword());

// JSONObject jo1=JSONObject.fromObject("{'id':12,'name':'gz','password':'a12345'}",config);
// Object tt= JSONObject.toBean(jo1);
// System.out.println(tt);

}

/\*\*  
 \* 使用registerPropertyExclusion达到前面的效果  
 \*/  
@Test  
public void fun3(){  
    Teacher t=new Teacher(12,"guodaxia","gz1234");  
    JsonConfig config=new JsonConfig();  
    config.registerPropertyExclusion(Teacher.class, "password");  
    JSONObject jo=JSONObject.fromObject(t, config);  
    System.out.println(jo);

}

/\*\*  
 \* 测试使用自定义JSONBeanProcessor  
 \* JsonBeanProcessor和实现JsonString很类似,返回一个代表原来目标对象的合法JSONObject  
 \*  
 \*/  
@Test  
public void fun4(){  
    JsonConfig config=new JsonConfig();  
    config.registerJsonBeanProcessor(Teacher.class,new JsonBeanProcessor() {

        public JSONObject processBean(Object bean, JsonConfig config) {  
            Teacher tea=(Teacher)bean;  
            return new JSONObject().element("id", tea.getId()).element("name", tea.getName());  
        }  
    });  
    Teacher t=new Teacher(12,"JSON","json");  
    System.out.println(JSONObject.fromObject(t,config));

}

/\*\*  
 \* 自定义JsonValueProcessor  
 \* 比如我们要控制JSON序列化过程中的Date对象的格式化以及数值的格式化,JsonValueProcessor是最好的选择  
 \* 该方法可以用来处理数据,进行格式化操作等等  
 \*/  
@Test  
public void fun5(){  
    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 sdf=new SimpleDateFormat("yyyy-MM-dd");

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

        public Object processArrayValue(Object date, JsonConfig config) {  
            return sdf.format(date);  
        }  
    });  
    System.out.println(JSONObject.fromObject(map, config));

}

}