应用场景:把js的object转化为json格式,以便提交该js对象
然后由服务端把js对象(json格式)进行一定的处理.
举例:下面一个ajax提交js object到服务器[服务器使用java将json转化为实例对象]的例子
客户端:
/**将javascript object转化为json格式数据的方法**/
function _ToJSON(o){
//.....具体方法在文章最后
}
/**一个复杂的js类**/
OrderInfo=new function(){
this.totalprice=0;
this.orderDate="2012-12-21";
this.message="";
this.products=new Array();//订购的商品列表
}
/**定义上面js类的一个对象**/
var order=new OrderInfo();
var p1=new Product(........);//一个商品
var p2=new Product(........);//另一个商品
order.push(p1);
order.push(p2);
order.totalprice='123.00';
//ok,order对象现在应该足够复杂了
/**下面用ajax的方式来提交它(jquery)**/
$.ajax({
url: '/cart/order.action',
type: 'POST',
data:{jsonData:escape( _ToJSON(order))}, //jsonData为此次post提交时,提交的参数,你可自定义其名称
dataType:"json",
timeout: 10000,
error: function(){alert('Error posting data');},
success: function(result){
alert('订单保存成功'+result);
}//function
});
注意:上面的代码,因考试到json中有中文或其他特殊字符,对json格式进行了escape编码(要求后台接收此参数后进行unescape操作)
服务端
使用json-lib.jar,里面提供了一些类,可以将json字符将化为java对象
String escaped_json=request.getParameter("jsonData");//获取提交的参数值,jsonData与上面红体字的jsonData相对应
String json=UtilTool.unescape(escaped_json);//将得到的json,进行unescape解析,(UtilTool是我自定义的类)
JSONObject jsonObject = JSONObject.fromObject(json);
Map<String, Class> m = new HashMap<String, Class>();
m.put("products", Product.class);//"products"与js object里的products对应,Product.class类的字段与客户端new Product(........);具有相同的数据结构
Order o=(Order)JSONObject.toBean(jsonObject, OrderInfo.class, m);
这样前台提交的orderinfo对象,就转化成了java里的Order对象,当然前题是:前后端对象的数据结构要一致
<!---over---->
/**修改后的用于js对象序列化的方法**/
function _ToJSON(o){
if(o == null)
return "null";
switch(o.constructor) {
case String:
var s = o; // .encodeURI();
if(s.indexOf("}")<0)s = '"' + s.replace(/(["\\])/g, '\\$1') + '"';
s = s.replace(/\n/g,"\\n");
s = s.replace(/\r/g,"\\r");
return s;
case Array:
var v = [];
for(var i=0; i<o.length; i++)
v.push(_ToJSON(o[i])) ;
if(v.length<=0)return "\"\"";
return "" + v.join(",") + "";
case Number:
return isFinite(o) ? o.toString() : _ToJSON(null);
case Boolean:
return o.toString();
case Date:
var d = new Object();
d.__type = "System.DateTime";
d.Year = o.getUTCFullYear();
d.Month = o.getUTCMonth() +1;
d.Day = o.getUTCDate();
d.Hour = o.getUTCHours();
d.Minute = o.getUTCMinutes();
d.Second = o.getUTCSeconds();
d.Millisecond = o.getUTCMilliseconds();
d.TimezoneOffset = o.getTimezoneOffset();
return _ToJSON(d);
default:
if(o["toJSON"] != null && typeof o["toJSON"] == "function")
return o.toJSON();
if(typeof o == "object") {
var v=[];
for(attr in o) {
if(typeof o[attr] != "function")
v.push('"' + attr + '": ' + _ToJSON(o[attr]));
}
if(v.length>0)
return "{" + v.join(",") + "}";
else
return "{}";
}
alert(o.toString());
return o.toString();
}
};