.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 deserialize 14  { 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM