.NET中如何使用反序列化JSON字元串/序列化泛型對象toJsonStr

来源:http://www.cnblogs.com/Hal-tan/archive/2016/03/16/5283129.html
-Advertisement-
Play Games

在進行 .NET Web MVC 框架開發的網站程式的時候,我們都會遇到最關鍵的問題,數據傳輸。 .NET MVC 4中的ControllerBase類建議我們用ViewBag動態數據字典形式(type:dynamic,JavaScript就是動態語言,只在運行時候才進行類型判斷,而不是在編譯),或


 

在進行 .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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 異常處理彙總-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 舉個例子 重點:display:flex (參考:http://www.360doc.com/content/14/0811/01/2633_400926000.shtml) 效果
  • 一、前言 異常處理是每個系統必不可少的一個重要部分,它可以讓我們的程式在發生錯誤時友好地提示、記錄錯誤信息,更重要的是不破壞正常的數據和影響系統運行。異常處理應該是一個橫切點,所謂橫切點就是各個部分都會使用到它,無論是分層中的哪一個層,還是具體的哪個業務邏輯模塊,所關註的都是一樣的。所以,橫切關註點
  • 本文闡述C#中相等性比較,其中主要集中在下麵兩個方面 ==和!=運算符,什麼時候它們可以用於相等性比較,什麼時候它們不適用,如果不使用,那麼它們的替代方式是什麼? 什麼時候,需要自定一個類型的相等性比較邏輯 在闡述相等性比較,以及如何自定義相等性比較邏輯之前,我們首先瞭解一下值類型比較和引用類型比較
  • CheckBox控制項,由於它的值是選擇與非選擇。因此在提交數據時,想讓用戶必須選擇CheckBox,普通情況之下,不好做驗證。 但我們可以使用asp:CustomValidator來驗證,不過還得寫自定義驗證Javascript代碼,可參考如下:
  • Mysql操作 調用
  • 項目中用到了EF Code First和遷移,但發現有些方面似懂非懂。比如:如何在遷移文件中控制遷移過程?如果在遷移文件中執行SQL語句?如何使用Update-Database的其它參數?資料庫在生產環境的時候如何遷移?於是就有了下麵的這些體驗:enable-migration第一次生成資料庫時使用
  • 摘要: 介紹緩存的基本概念和常用的緩存技術,給出了各種技術的實現機制的簡單介紹和適用範圍說明,以及設計緩存方案應該考慮的問題(共17頁) · 性能——將相應數據存儲起來以避免數據的重覆創建、處理和傳輸,可有效提高性能。比如將不改變的數據緩存起來,例如國家列表等,這樣能明顯提高web程式的反應速度;
  • 效果: 編寫節目類 屬性:播出時間、時段、名稱、視頻路徑 編寫頻道基類 屬性:頻道名稱、頻道節目單位置、節目列表 抽象方法:Fetch() 編寫頻道子類 繼承“頻道基類”,實現Fetch()【只寫方法聲明】 編寫頻道工廠類 方法:實現創建頻道子類 第一步.創建幾個類: 01:創建一個電視類(TvPr
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...