Nomad & His Life

博观而约取,厚积而薄发
posts - 15, comments - 88, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

让JSON.org支持JavaBean

Posted on 2006-10-06 20:18 Nomad 阅读(1771) 评论(1)  编辑  收藏 所属分类: JavaAjax
JSON.org包里的方法对JavaBean没有支持,而JSON-lib虽然功能丰富,但是依赖很多其它的包,为了方便我就写了一个类继承于JSONObject,方便JavaBean的使用。

源代码:
package net.jialing;

import java.lang.reflect.Method;
import java.util.StringTokenizer;

/**
 * 支持JavaBean的JSONObject
 *
 * 
@author Michael
 * 
@since 2006-10-4
 * 
@version 0.1a
 
*/

public class JSONReflectObject extends JSONObject {
    
    
public JSONReflectObject() {
        
super();
    }
    
    
/**
     * 构造函数
     * 
@param object 需要得到信息的JavaBean
     * 
@param names 属性的字符串数组
     
*/
    
public JSONReflectObject(Object object, String names[]) {
        
this();
        
for (int i = 0; i < names.length; i += 1) {
            
try {
                String name 
= names[i];
                setProperty(object,name);
            } 
catch (Exception e) {
                
/* forget about it */
            }
        }
    }
    
    
/**
     * 得到JavaBean的某个属性,支持加.得到属性的属性
     * 
     * 
@param owner 对象
     * 
@param property  属性名
     * 
@return 方法返回值
     * 
@throws Exception
     
*/
    
private void setProperty(Object owner, String property)
            
throws Exception {

        Class ownerClass;
        Object[] args 
= null;
        Class[] argsClass 
= null;
        

        
int i=0,loop=0//i表示第几层JSOBObject,loop表示循环了几次
        
        StringTokenizer st 
= new StringTokenizer(property,".");
        
        JSONObject jo[] 
= new JSONObject[st.countTokens()-1];
        
for(int x=0,y=jo.length;x<y;x++) {
            jo[x] 
= new JSONObject();
        }
        
        
while (st.hasMoreTokens()) {
            String propertyName 
= st.nextToken();
             
          ownerClass 
= owner.getClass();
        String methodName 
= "get"
                        
+ propertyName.substring(0,1).toUpperCase() 
                        
+ propertyName.substring(1);

        Method method 
= ownerClass.getMethod(methodName, argsClass);
        owner 
= method.invoke(owner, args);

        
if(st.hasMoreTokens()) {
            
if( loop == 0
                
this.put(propertyName,jo[0]);
            
else 
                jo[i].put(propertyName, jo[
++i]);
                
            loop
++;
        }
            
else {
                
if(loop==0)
                    
this.put(propertyName, owner.toString());
                
else
                    jo[i].put(propertyName, owner.toString());
            }
            
        }

    }
    
}


测试准备:

public class Student {
    
private String name;
    
private String email;
    
private Birthday birthday;

      getter and setter
}

public class Birthday {
    
private Year year;
    
private String month;
    
private String day;

      
public Birthday(String year,String month,String day){
        
this.year = new Year(year);
        
this.month = month;
        
this.day = day;
    }

      getter and setter
}

public class Year {
    
private String y;

      getter and setter
    
    
public Year(String y){
        
this.y = y;
    }
}

测试:
public class Test {
    
      
public String singleObject() throws JSONException {
        Student s 
= new Student();
        s.setName(
"Jack");
        s.setEmail(
"jack@a.com");
        s.setBirthday(
new Birthday("1990","12","30"));
        
        String[] params 
= {"name","email","birthday.year.y"};
        
        JSONReflectObject jo 
= new JSONReflectObject(s,params);
        
return jo.toString();
    }

      
public static void main(String args[]) throws Exception{
        test t 
= new test();
        System.out.println(t.singleObject());
    }
}

1.首先新建一个Student
2.设置name,email,birthday属性
3.把要打印出的属性放在字符串数组里,支持加"."得到属性的属性
4.建立JSONReflectObject,将要输出的对象和属性数组作为参数
5.打印:{"email":"jack@a.com","name":"Jack","birthday":{"year":{"y":"1990"}}}

评论

# re: 让JSON.org支持JavaBean  回复  更多评论   

2006-10-08 12:57 by justfly
看了看,失望,只有bean2json没有json2bean
而且bean2json的使用还不够自动化。

只有注册用户登录后才能发表评论。


网站导航: