json转化
实现将不同格式对象转化为json对象,同时讨论了如何实现过滤字段。
感谢二次加工博文:http://www.cnblogs.com/vmax-tam/p/4624811.html;http://www.cnblogs.com/vmax-tam/p/4624869.html
一:转json
参考资料:http://swiftlet.net/archives/category/json,十分感谢~
平时做项目,难免有遇到使用json对象的时候,这个东西不难,但是一不使用久了,就会忘记,所以把它的基本用法写一下。
前提: 导入相关的jar文件:
commons-lang-1.0.4.jar
commons-collections-2.1.jar
commons-beanutils-1.8.0.jar
json-lib-2.4.jar
ezmorph-1.0.6.jar
commons-logging-1.1.jar
然后就可以开发啦~
一)javaBean转换为json
(1)先写一个javaBean
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后就把这个javaBean转换为JSONObject:
public static void main(String[] args) {
//javaBean对象转换为json字符串
User user = new User();
user.setUsername("Rime");
user.setPassword("1234");
JSONObject json1 = JSONObject.fromObject(user);
System.out.println(json1.toString());
//map转换为json字符串
HashMap<Object,Object> userMap = new HashMap<Object,Object>();
userMap.put("username", "Rime");
userMap.put("password", "1234");
JSONObject json2 = JSONObject.fromObject(userMap);
System.out.println(json2.toString());
}
输出的内容如下:
{"password":"1234","username":"Rime"}
{"username":"Rime","password":"1234"}
看到这里,你可能会有疑问,是不是什么对象都能够转换为JSONObject呢?答案当然是:不。
JSONObject.fromObject(Object object)方法只对以下集中类型的对象有效:JSON formatted strings,Maps,DynaBeans and JavaBeans。
【注意】DynaBeans是commons-beanutils定义的动态bean。DynaBean并不是Java中所定义的Bean,而是一种"假"的Bean。因为它并不是通过getXXX和setXXX方法,对XXX属性进行取值和设值的。
如果object是其他类型的参数呢?比如说数字,逻辑值,非json格式的字符串,那么将生产空的JSONObject对象。
二:字段过滤
这部分的内容主要是讲述 javaBean转换为JSONObect时,如果有些属性不需要转换,那么该如何操作。
过滤属性在什么时候会用到呢?
有时候我们会把对象以json格式传送,如果一个对象携带着一些私人信息,那么我们就要先把这些信息过滤掉,再进行传输了。
一)方法一:实现JSONString接口,实现toJSONString方法
那么我们现在写一个Person类,实现这个JSONString接口
public class Person implements JSONString{
private String name;
private String address;
private String sex;
@Override
public String toJSONString() {
//{"name" : "name" , "sex" : "sex"},这里省略了address属性,因为我们要把它过滤掉
return "{\"name\":\"" + name + "\",\"sex\":\"" + sex + "\"}";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
然后就写相应的测试
public static void main(String[] args) {
/**
* 转换为json对象时,排除掉person中address属性的三种方法
*/
System.out.println("方法一:Person类实现JSONString接口,实现toJSONString方法");
Person person = new Person();
person.setName("Rime");
person.setSex("men");
person.setAddress("china");
JSONObject json = JSONObject.fromObject(person);
System.out.println(json.toString());
}
输出结果:
方法一:Person类实现JSONString接口,实现toJSONString方法
{"name":"Rime","sex":"men"}
二)方法二:在jsonConfig中配置excludes
由于Person类已经使用了方法一,具有侵入性,我们再建一个类Person2
public class Person2 {
private String name;
private String address;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
然后过滤操作如下:
Person2 person2 = new Person2();
person2.setName("Rime2");
person2.setSex("men");
person2.setAddress("china");
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes(new String[] {"address"});//排除掉address属性
JSONObject json2 = JSONObject.fromObject(person2,jsonConfig);
System.out.println(json2.toString());
三)方法三:在jsonConfig中配置过滤器,把属性过滤掉
过滤操作如下:
Person2 person3 = new Person2();
person3.setName("Rime3");
person3.setSex("men");
person3.setAddress("china");
JsonConfig jsonConfig2 = new JsonConfig();
//配置过滤器
jsonConfig2.setJsonPropertyFilter(new PropertyFilter() {
@Override
public boolean apply(Object source, String name, Object value) {
//source:对象类型
//name:属性名
//value:属性值
//可根据以上三种组合来过滤
//Person2类型的address属性过滤掉
return source instanceof Person2 && name.equals("address");
}
});
JSONObject json3 = JSONObject.fromObject(person3,jsonConfig2);
System.out.println(json3.toString());