序列化与反序列化
前台(jQuery):
var objP = {};
objP.id = 1;
objP.name = 2;
objP.sex = 32;
JSON.stringify(objP)//序列化
JSON.parse(e); //JSON.parse(e)反序列化
后台(.net自带):
Person pp = new Person();
pp.id = "33";
pp.name = "44";
pp.sex = "true";
vare = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(pp);
vard = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Person>(e);
//前面的new不要忘了
后台(JSON.NET):
Person pp = new Person();
pp.id = "33";
pp.name = "44";
pp.sex = "true";
var a = Newtonsoft.Json.JsonConvert.SerializeObject(pp);
var e = Newtonsoft.Json.JsonConvert.DeserializeObject<Person>(a);
在前面的两种后台序列化和反序列化中,后都JSON.NET被证实比VS自带的效率要高,但是它们都要在前面加上一长串,这给实际的开发带来了不便,因此有必要对其进行封装。下面以JSON.NET为封装对象:
新建一个类JSONNet.cs:
public classJSONNet
{
//序列化将某个对象 value序列化成字符串
public static stringSerializeObject(object value)
{
returnNewtonsoft.Json.JsonConvert.SerializeObject(value);
}
//反序列化将已被序列化的字符串 value反序列化到某个对象当中
public static T Deserialize<T>(string value)
{
returnNewtonsoft.Json.JsonConvert.DeserializeObject<T>(value);
}
}
此时,再要进行序列化和反序列化时就可这样使用:
Person pp = new Person()
{
id = "20id",
name = "30name",
sex = "40sex"
};
var g = JSONNet.SerializeObject(pp);
var h = JSONNet.Deserialize<Person>(g)
序列化与反序列化的前台格式 对象Or集合
无论是前台还是后台进行序列化和反序列化,它们的前提就是要有值提供给它们操作。通常使用到序列化的有两种常况:一个是对象(类),一个List<>。
在为类对象时,前台JS中这样定义:
var objP = {};
objP.id = "id";
objP.name = "name";
objP.sex = "sex";
注意自定义对象后面的是大括号。此时,后台应该有一个类的字段名与objP的自定义属性名相对应,能对应上多少,在反序列化时就能得到多少字段的值。后台那个类通常时根据此时要上传的对象的字段来定义的。
在为List<>时,前台JS中这样定义:
var objO = [];
objO.push(1);
objO.push(2);
varobjP = {};
objP.id = objO;
经序列化后 接收到的值为:{\"id\":[1,2]}。这个时候后台还需要有一个类lp,它的有一个名为id的List<string>字段
public classlp
{
public List<string>id;
}
同样的,var i = JSONNet.Deserialize<lp>(p);
红色部分要对应
在.NET MVC中,当返回序列化字符串时,控制器的返回类型应为 string 。当使用MVC的序列化时,可直接使用ActionResult。
前台接收前显示序列化后的内容
在前台页面中,接收到服务器返回的内容后通常不需要再进行反序列化,可直接使用,如:后台有这样一个类,取值后被序列化,并返回到前台页面中:
public class BuViewModel
{
public string Id { get; set; }
public List<User>listU { get; set;}
}
那么,在前台页面中可这样做:
success: function (e) {
//直接取一般字段
$("#Id").val(e.Id);
//通过循环遍历List<>前附加
for (var i = 0; i< e.St.length; i++) {
var appendStr ="<optionvalue='" + e. listU [i].EmployeeId +"'>"+ e. listU [i].DisplayName + "</option>";
$("#st").append(appendStr);
}
}
完整代码如下:
前台:
<head>
<title>Index</title>
<script src="../../Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
var objP = {};
objP.id = 1;
objP.name = 2;
objP.sesx = 32;
$.ajax({
cache: false,
url: "/Base/GetIndex/",
data: objP,//直接将在JS中的自定义对象发过去,自定义对象中的“属性”(字段名)必须和后台接收的实体的字段名一至
success: function (e) {
alert("Success");
},
error: function () {
alert("Error...");
}
});
});
</script>
<script type="text/javascript">
$(function () {
var objO = [];
objO.push(1);
objO.push(2);
var objP = {};
objP.id = objO;
// objP.id = "id";
//objP.name = "name";
//objP.sex = "sex";
$.ajax({
cache: false,
url: "/Base/GetJsonIndex/",
data: { "p": JSON.stringify(objP) },
success: function (e) {
console.log(e);
console.log(JSON.parse(e)); //JSON.parse(e)反序列化
alert(e.id);
alert("Success");
},
error: function () {
alert("Error...");
}
});
});
</script>
</head>
后台:
public class BaseController : Controller
{
//
// GET: /Base/
public ActionResult Index()
{
return View();
}
[HttpGet]
public ActionResult GetIndex(Person p)//直接获取对象
{
var a = p;
var b = a.id;
var c = a.name;
var d = a.sex;
return View();
}
[HttpGet]
public string GetJsonIndex(string p)
{
var i = JSONNet.Deserialize<lp>(p);
Person pp = new Person()
{
id = "20id",
name = "30name",
sex = "40sex"
};
var e = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(pp);
var d = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Person>(e);
var a = Newtonsoft.Json.JsonConvert.SerializeObject(pp);
var f = Newtonsoft.Json.JsonConvert.DeserializeObject<Person>(a);
var g = JSONNet.SerializeObject(pp);
var h = JSONNet.Deserialize<Person>(g);
var b = Json(pp, JsonRequestBehavior.AllowGet);
return e;
}
}