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]
最近做一个模块,在项目在就应用了 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]