JSON的使用(js/java)总结

JSON的使用(js/java)总结
 
最近做一个模块,在项目在就应用了 ajax来实现异步刷新分页。由于查询参数很多且包括不同的类型。如数组,set,date等。所以本人在这里用json来进行参数传递。
以前做的项目中用到了 jqery,也大量使用ajax。但由于项目框架是公司平台,很多东西都是现成的,虽然也大量用json.但对json还是只有浅显的了解。
   由于以前的项目源码一时找不到,找到了整理也觉费事,所以这次是自己动手,也正好加深自己对json的理解,做一个简单总结,和大家共享。
   很多时候,自己动手跟在一个已有框架中照搬他人的是大不一样的,自己做的时候需要去了解很多的细节,己也能更好地掌握相关知识。

  一.客户端(jsp页面javaxscript)
首先页面要导入json.js.可到官网下载。www.json.org,我的附件中也有。
   javaEE在客户端通常是ajax请求才会用到json来传递参数。
    先声明一个对象:
   var taskQueryJson={};
   taskQueryJson.pageNum=10;
   taskQueryJson.pageSize=10;
   taskQueryJson.isAllType=true;
   taskQueryJson.beginQueryTime="2010-12-20 10:19:30";
 
    jquery中默认会自己将对象参数转换成json字符串。这里以原生ajax为例:
var url = "/progress/taskProgressQuery.do?JSON="+JSON.stringify(taskQueryJson);    
则如上即可,用JSON.stringify方法或toJSONString方法都可以。
如果在前台要把json字符串转换成对象。则调用javascript自身的eval函数:
var result=eval('(' + userJsonStr+ ')');就会把返回的json字符串转换成json对象。
也可以象下面,下面是json.js 中的方法:
var obj = str.parseJSON(); //由JSON字符串转换为JSON对象

    或者

    var obj = JSON.parse(str); //由JSON字符串转换为JSON对象


二. json in java中.
   后台主要是把传递过来的json字符串转换成java bean或者将对象转换成字符串向客户端返回。
  首先要导入json的jar包( 首先到官网下载)。有包名org.json命名的的json.jar和包名为net.sf.json的json-lib.jar;两个包有所不同,大家要注意,我这里采用后面的jar包。json-lib-2.3-jdk13.jar,大家在使用的时候还要注意所支持的jdk版本,如这是支持jdk1.5以前版本的jar包,json-lib-2.3-jdk15.jar则只支持jdk1.5及以上版本,另外这个包还依赖ezmorph.jar,commons-lang.jar; commons-beanutils.jar;commons-collections.jar;commons-logging.jar;这 些jar包。ezmorph.jar最好用1.0.6版本。
   下面是示例。
对于日期的处理,需要注意。下面有一个专门的日期格式处理类。

  这是写一个简单的工具类:
import java.io.Writer;
import java.util.Collection;
import java.util.Date;

import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.util.JSONUtils;
import stat2.common.task.domain.TaskQuery;

public class JsonUtils {

/**
*
* @param json
* @param c
* @param excludes 不需要转换的属性数组 
* @param datePattern 日期转换模式 
* @return
*/
public static Object json2Bean(String json,Class c,String[] excludes, String datePattern){
JSONObject jsonObject=fromObject(json,excludes,datePattern);
return JSONObject.toBean(jsonObject, c);
}

/**
*
* @param json
* @param c
* @param excludes 不需要转换的属性数组 
* @return
*/
public static Object json2Bean(String json,Class c,String[] excludes){
JSONObject jsonObject=fromObject(json,excludes,null);
return JSONObject.toBean(jsonObject, c);
}

/**
*
* @param json
* @param c
* @param datePattern 日期转换模式
* @return
*/
public static Object json2Bean(String json,Class c, String datePattern){
JSONObject jsonObject=fromObject(json,datePattern);
return JSONObject.toBean(jsonObject, c);
}

/**
*
* @param json
* @param c
* @return
*/
public static Object json2Bean(String json,Class c){
JSONObject jsonObject=fromObject(json);
return JSONObject.toBean(jsonObject, c);
}

/**
* 取得json字符串中的一个key所对应的字符串值
* @param json
* @param key
* @return
*/
public static  String getString(String json,String key){
JSONObject jsonObject=fromObject(json);
return jsonObject.getString(key);
}

/**
* 取得json字符串中的一个key所对应的值
* @param json
* @param key
* @return
*/
public static  Object get(String json,String key){
JSONObject jsonObject=fromObject(json);
return jsonObject.get(key);
}

/**
* 将对象转换成json字符串
* @param object
* @return
*/
public static String getJsonString(Object object){
String jsonString = null;
  if(object != null){
   if(object instanceof Collection || object instanceof Object[]||object instanceof String[]||object instanceof int[]||
                   object instanceof long[]||object instanceof double[]||object instanceof float[]){
   jsonString = JSONArray.fromObject(object, getconfigJson(null, null)).toString();
   }else{
   return  fromObject(object).toString();
   }
  }
  return jsonString == null ? "{}" : jsonString;

}

private static JSONObject fromObject(Object obj, String datePattern) {   
        return fromObject(obj,null,datePattern);
   }
  
private static JSONObject fromObject(Object obj,String[] excludes, String datePattern) { 
setDateFormat2Java();
JsonConfig jsonConfig=getconfigJson(excludes,datePattern);
return JSONObject.fromObject(obj,jsonConfig);
   }



private static JSONObject fromObject(Object obj){
return fromObject(obj, null,null);
}

/** 
  * 配置json-lib需要的excludes和datePattern. 
  * 
  * @param excludes 不需要转换的属性数组 
  * @param datePattern 日期转换模式 
  * @return JsonConfig 根据excludes和dataPattern生成的jsonConfig,用于write 
  */  
private static JsonConfig getconfigJson(String[] excludes,  
     String datePattern) {  
     JsonConfig jsonConfig = new JsonConfig(); 
   //  if(null!=excludes)
     jsonConfig.setExcludes(excludes);
    
     jsonConfig.setIgnoreDefaultExcludes(false);  
     jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);  
     jsonConfig.registerJsonValueProcessor(Date.class,  
         new DateJsonValueProcessor(datePattern));  
   
     return jsonConfig;  


/** 
  * write. 
  * 
  * @param bean obj 
  * @param writer 输出流 
  * @param excludes 不转换的属性数组 
  * @param datePattern date到string转换的模式 
  * @throws Exception 写入数据可能出现异常 
  */  
public static void write(Object bean, Writer writer,  
     String[] excludes, String datePattern) throws Exception {  
     JsonConfig jsonConfig = getconfigJson(excludes, datePattern);  
   
     JSON json = JSONSerializer.toJSON(bean, jsonConfig);  
   
     json.write(writer);  


private static void setDateFormat2Java(){
JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[]{"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"}));
}
/**
* @param args
*/
public static void main(String[] args) {
String jsonObjString="{\"isAllUser\":\"false\",\"statuses\":[2],\"isAllType\":\"true\",\"pageNum\":2,\"beginQueryTime\":\"2010-12-03 12:12:12\"}";
TaskQuery taskQuery=(TaskQuery)json2Bean(jsonObjString, TaskQuery.class);
System.out.println(taskQuery.getBeginQueryTime());
System.out.println(taskQuery.getIsAllUser());
System.out.println(taskQuery.getStatuses());

}

}

2.一个日期转换类
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

public class DateJsonValueProcessor implements JsonValueProcessor {

  /** * logger. */
    private static Log logger = LogFactory.getLog(DateJsonValueProcessor.class);

    /** * 默认的日期转换格式. */
    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd:hh:mm:ss";

    /** * 日期转换器. */
    private DateFormat dateFormat;

    /**
     * 构造方法.
     *
     * @param datePattern 日期格式
     */
    public DateJsonValueProcessor(String datePattern) {
        try {
        datePattern=null==datePattern?DEFAULT_DATE_PATTERN:datePattern;
            dateFormat = new SimpleDateFormat(datePattern);
        } catch (Exception ex) {
            logger.error(ex);
            dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
        }
    }

    /**
     * 转换数组?.
     *
     * @param value Object
     * @param jsonConfig 配置
     * @return Object
     */
    public Object processArrayValue(Object value, JsonConfig jsonConfig) {
        return process(value);
    }

    /**
     * 转换对象.
     *
     * @param key String
     * @param value Object
     * @param jsonConfig 配置
     * @return Object
     */
    public Object processObjectValue(String key, Object value,
        JsonConfig jsonConfig) {
        return process(value);
    }

    /**
     * 格式化日期.
     *
     * @param value Object
     * @return Object
     */
    private Object process(Object value) {
        try {
            return dateFormat.format((Date) value);
        } catch (Exception ex) {
            return null;
        }
    }

}

TaskQuery是一个普通java bean.具有相应属性及Setter和getter方法。见附件。
JsonUtils中的main函数中是简单的示例代码,运行JsonUtils.就可以得到输出结果。

上述代码及jar包也均在附件中。

google的gson.jar也不错,不过本人还很少使用它,这里只把这个jar包传在这里。相关文章很多,推荐可以看看这个[url]http://www.cnblogs.com/zero0/articles/1874792.html
[/url]

你可能感兴趣的:(java,json,.net,bean,Ajax)