你的位置:首页 > ASP.net教程

[ASP.net教程].NET中如何使用反序列化JSON字符串/序列化泛型对象toJsonStr


 

在进行 .NET Web MVC 框架开发的网站程序的时候,我们都会遇到最关键的问题,数据传输。

 

.NET MVC 4中的ControllerBase类建议我们用ViewBag动态数据字典形式(type:dynamic,JavaScript就是动态语言,只在运行时候才进行类型判断,而不是在编译),或者用ViewData数据字典(type:dictionary<string,object>)形式返回我们绑定的值。也就是说,ViewBag存储的数据的类型都是在使用的时候才确定的,但是ViewData的数据在创建对象的时候就已经确定了。具体区别不做赘述。

 

但是,这样绑定会有一定的局限性,因为网页上展示的多样化,使得上述方式复杂。比如:一个列表上显示了5条数据,又需要展示10条,我们就不能用mvc的类来解决了。更好的解决方式还是用AJAX+JS来解决,

 

AJAX可以处理很多类型的数据,目前JSON因为其轻量且直观方便广泛的被应用在数据传输上,后台程序提供JSON数据,前台利用JS进行处理就可以完成很多我们想做的操作。

 

1)序列化,顾名思义,使之变得有序,在程序中就可以理解为将一个指定对象变成了JSON键值对

后台代码由于.NET的类库我们可以轻松完成。

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Script.Serialization;using System.Runtime.Serialization;using System.Runtime.Serialization.Json;namespace Controllers{

[Serializable]
[DataContract]

public class NewsOperationsController : Controller

{

 public ActionResult Index(){
List<T> rult = new List<T>();//创建泛型对象LIST //利用MVC的json方法直接序列化对象
return Json(rult, JsonRequestBehavior.AllowGet);}
}


}

 

前台需要的是发送请求,然后处理JSON字符串

 1   2 function getData() { 3       4  $.post(appURL + "NewsOperations/index/" , {}, function (data) { 5   6  //将json对象转化为JSON字符串  7   var myJson= JSON.stringify(data); 8   9  console.log(myJson);   10 11 12 }, "json");13     }

 

2)反序列化

反序列化得步骤恰恰相反,但是更为复杂

后台接受前台的数据,有两种方式

1)通过ajax的data传送json键值对/通过form提交/或者直接写在URL后面,但是这样有一个不好之处,在后台仍然需要对数据一个一个处理,也就是说,在后台需要创建对象在为其一一赋值

2)前台加大代码量,拼凑JSON对象,发送至后台直接进行反序列化处理,为对象赋初始化。

第一种方法较为常见,第二种是我自己想尝试而为之的,也分享一下。

前台:

 1  //提交信息,采用拼接JSON字符数组数据提交,为后台反序列化提供数据 2    3 function submitPage() { 4        5 var da = new Date(); 6 //获取现在时间 7 var Now = da.getFullYear() + "-" + da.getMonth() + "-" + da.getDate() + " " + da.getHours() + ":" + da.getMinutes() + ":" + da.getSeconds(); 8 //随便写一些数据举例 9 var data=[1,2,3,4,5,6];10 //拼接字符串 ps: 必须写成 [{"a":b,"c":d...}]形式,因为反序列化以数组为单位,[]代表一个数组对象,每个{}代表一个JSON对象11 var json = "";12 json += "[{";13 json += "\"NewsID\":" + data[0] + ",";14 json += "\"NewsTitle\":\"" + data[0] + "\",";15 json += "\"NewsContent\":\"" + data[0] + "\",";16 json += "\"ReporterName\":\"" + data[0] + "\",";17 json += "\"ReporterName\":\"" + data[0] + "\",";18 json += "\"CategoryName\":\"" + data[0] + "\",";19 json += "\"Createtime\":\"" + Now + "\"";20 json += "}]";21 22 if (confirm("是否提交!") == true) {  23       24 $.post(appURL + "NewsOperations/submit", {index:json }, function (data) {25         26   if (data.Success) {27      alert("提交成功");28         29     } else {30      31       alert("提交失败");32           }33         }, "json");34 35       } else {      36       }      37     }

 

后台处理,需要用到一个静态类

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using System.Web.Script.Serialization; 7 using System.IO; 8 using System.Text; 9 using System.Runtime.Serialization;10 using System.Runtime.Serialization.Json;11 12 namespace controllers{13 public static class deserialize14   {15 //返回一个指定类型的LIST对象16    public static List<T> JSONStringToList<T>(this string JsonStr)17     {18       JavaScriptSerializer Serializer = new JavaScriptSerializer();19      20       List<T> objs = Serializer.Deserialize<List<T>>(JsonStr);21      22       return objs;23     }24 //返回一个类型的对象25     public static T Deserialize<T>(string json)26     {27       T obj = Activator.CreateInstance<T>();28       29       using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))30       {31       DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());32       33       return (T)serializer.ReadObject(ms);34       }35     }36 37   }38 39 40 public ActionResult submit(string json)41  {42 43 //反序列化JSON字符,初始化对象44  List<T> model = deserialize.JSONStringToList<T>(json);45 //....后续就可以自己操作啦!!46 47 }48 49 }


到这里,json的反序列化和序列化就讲完了,欢迎各位大神拍砖!小弟还没入行,学习ING,请多指教!

兴趣爱好:guitar , sing , and so on

本人QQ:601761267