JavaScriptSerializer類 對象序列化為JSON,JSON反序列化為對象

JavaScriptSerializer 類由異步通信層內部使用,用于序列化和反序列化在瀏覽器和 Web 服務器之間傳遞的數據。說白了就是能夠直接將一個C#對象傳送到前臺頁面成為javascript對象。要添加System.Web.Extensions.dll的引用。該類位于System.Web.Script.Serialization命名空間下。

一、屬性

MaxJsonLength 獲取或設置 JavaScriptSerializer 類接受的 JSON 字符串的最大長度。?
RecursionLimit 獲取或設置用于約束要處理的對象級別的數目的限制。

二、方法

ConvertToType<(Of <(T>)>) 將給定對象轉換為指定類型。?
Deserialize<(Of <(T>)>) 將指定的 JSON 字符串轉換為 T 類型的對象。?
DeserializeObject 將指定的 JSON 字符串轉換為對象圖。?
RegisterConverters 使用 JavaScriptSerializer 實例注冊自定義轉換器。?
Serialize 已重載。 將對象轉換為 JSON 字符串。

?給個示例,主要就是了解了一下Serialize與Deserialize兩個方法,控制器代碼:

復制代碼
    public class HomeController : Controller{public ActionResult Index(){return View();}public ActionResult GetJson(){JavaScriptSerializer jss = new JavaScriptSerializer();Person p = new Person(1, "張飛", 20);string json = jss.Serialize(p); //序列化成JSONPerson p1 = jss.Deserialize<Person>(json);  //再反序列化為Person對象    注意此方法要求目標類有無參構造函數//return Json(json, "text/json");     //很好用,但是返回的終歸是字符串,返回到前臺要解析一下才能變成javascript對象。return Json(new { Id = p1.Id, Name = p1.Name, Age = p1.Age }, "text/json");//如果這樣寫,返回到javascript中是不用再解析的,直接就是javascript對象}}public class Person{public Person(){ }public Person(int id, string name, int age){this.Id = id;this.Name = name;this.Age = age;}public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }}
復制代碼

前臺HTML代碼:

復制代碼
<html>
<head><title>javascriptSerializer類測試</title><script src="/jQuery.1.8.3.js" type="text/javascript"></script><script type="text/javascript">$(function () {$(":button").click(function () {$.ajax({url: "/Home/GetJson",dataType: "json",type: "post",success: function (response) {
//                        var data = JSON.parse(response);
//                        $("#Id").text(data.Id);
//                        $("#Name").text(data.Name);
//                        $("#Age").text(data.Age);$("#Id").text(response.Id);$("#Name").text(response.Name);$("#Age").text(response.Age);}})})})</script>
</head>
<body><ul><li id="Id"></li><li id="Name"></li><li id="Age"></li></ul><input type="button" value="確認" />
</body>
</html>
復制代碼

?  試下4個基礎方法與屬性

復制代碼
class Program{static void Main(string[] args){// 方法 // RegisterConverters 使用 JavaScriptSerializer 實例注冊自定義轉換器。  //屬性// RecursionLimit 獲取或設置用于約束要處理的對象級別的數目的限制。 JavaScriptSerializer jss = new JavaScriptSerializer();Console.WriteLine(jss.MaxJsonLength);   //默認接受最大的長度是 2097152    這個是接受JSON字符串的最大長度,超長會有什么后果呢?試下jss.MaxJsonLength = 1;Person p = new Person(1,"關羽",21);//string json = jss.Serialize(p);     //將對象序列化成Json字符串    //此處報異常使用 JSON JavaScriptSerializer 進行序列化或反序列化時出錯。字符串的長度超過了為 maxJsonLength 屬性設置的值。jss.MaxJsonLength = 2097152;//序列化string json = jss.Serialize(p); Console.WriteLine(json);    //輸出 {"Id":1,"Name":"關羽","Age":21}`這就是Json格式了//反序列化DeserializePerson p2 = jss.Deserialize<Person>("{\"Id\":1,\"Name\":\"關羽\",\"Age\":21}");Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age);    //輸出 1 關羽 21//Deserialize的非泛型寫法Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"關羽\",\"Age\":21}",typeof(Person)) as Person;  //注意這個方法返回的是object類,因此要強制轉換成Person類Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age);    //同樣輸出 1 關羽 21object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"關羽\",\"Age\":21}");    //將Json字符轉換為Object類型//Person p4 = obj as Person;    //此行代碼轉為的p4為nullPerson p4 = jss.ConvertToType<Person>(obj);     //尼瑪,原來這個方法是這樣用的,知道DeserializeObject轉換會為null所以另外寫一個嗎Console.WriteLine(p4.Name);     //輸出關羽//非泛型版本Person p5 = jss.ConvertToType(obj,typeof(Person)) as Person;Console.WriteLine(p5.Name);     //輸出關羽Console.ReadKey();}}
復制代碼

  實現自定義轉換器

  將指定的數據類型序列化為Json。Serialize方法是個遞歸方法,會遞歸地序列化對象的屬性,因此在序列化一個復雜對象(比如DataTable)時往往會出現“循環引用”的異常,這時候就需要針對復雜類型自定義一個轉換器。下面是DataTable的轉換器,原理是把DataTable轉換成一個字典列表后再序列化:

所有自定義的轉換器都要繼承于JavaScriptConverter,并實現Serialize、Deserialize方法和SupportedTypes屬性,其中SupportedTypes屬性用于枚舉此轉換器支持的類型。

復制代碼
    class Program{static void Main(string[] args){DataTable dt = new DataTable();dt.Columns.Add("Id");dt.Columns.Add("Name");dt.Columns.Add("Age");dt.Rows.Add(1, "關羽", 21);dt.Rows.Add(2, "劉備", 22);dt.Rows.Add(3, "張飛", 20);JavaScriptSerializer jss = new JavaScriptSerializer();//注冊轉換器的方法,用于復雜轉換  除了實現還需要注冊到JavaScriptSerializerjss.RegisterConverters(new JavaScriptConverter[] { new DataTableConverter() });string strJson = jss.Serialize(dt);Console.WriteLine(strJson);//輸出 {"Rows":[{"Id":"1","Name":"關羽","Age":"21"},{"Id":"2","Name":"劉備","Age":"22"},{"Id":"3","Name":"張飛","Age":"20"}]}Console.ReadKey();}}/// <summary>/// DataTable JSON轉換類/// </summary>public class DataTableConverter : JavaScriptConverter{public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer){DataTable dt = obj as DataTable;Dictionary<string, object> result = new Dictionary<string, object>();List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();foreach (DataRow dr in dt.Rows){Dictionary<string, object> row = new Dictionary<string, object>();foreach (DataColumn dc in dt.Columns){row.Add(dc.ColumnName, dr[dc.ColumnName]);}rows.Add(row);}result["Rows"] = rows;return result;}public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer){throw new NotImplementedException();}/// <summary>/// 獲取本轉換器支持的類型/// </summary>public override IEnumerable<Type> SupportedTypes{get { return new Type[] { typeof(DataTable) }; }}}
復制代碼

限制序列化的層次

復制代碼
class Program{static void Main(string[] args){JavaScriptSerializer jss = new JavaScriptSerializer();Console.WriteLine(jss.RecursionLimit);  //默認的序列化層次是100Person p1 = new Person(1, "劉備", 24);p1.p = new Person(2, "關羽", 23);p1.p.p = new Person(3, "張飛", 21);string strJson = jss.Serialize(p1);Console.WriteLine(strJson);//輸出 {"Id":1,"Name":"劉備","Age":24,"p":{"Id":2,"Name":"關羽","Age":23,"p":{"Id":3,"Name":"張飛","Age":21,"p":null}}}//現在將層次減少到1jss.RecursionLimit = 1;string strJson2 = jss.Serialize(p1);//這行代碼是報異常的,顯示已超出 RecursionLimit。 這就是這個屬性的作用//最后再來說一個特性,比如如果我有某一個屬性不希望它序列化,那么可以設置添加Console.ReadKey();}}public class Person{public Person(){ }public Person(int id, string name, int age){this.Id = id;this.Name = name;this.Age = age;}public int Id { get; set; } public string Name { get;  set; } public int Age { get; set; } //里面嵌套一個Personpublic Person p { get; set; }}
復制代碼

[ScriptIgnore]禁止某屬性序列化?

復制代碼
class Program{static void Main(string[] args){JavaScriptSerializer jss = new JavaScriptSerializer();Person p = new Person(1,"劉備",24);Console.WriteLine(jss.Serialize(p));File.WriteAllText(@"D:\123.txt", jss.Serialize(p));  //輸出 {"Id":1,"Age":24}Console.ReadKey();}}public class Person{public Person(){ }public Person(int id, string name, int age){this.Id = id;this.Name = name;this.Age = age;}public int Id { get; set; } [ScriptIgnore]public string Name { get; set; } public int Age { get; set; }}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281350.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nodejs 實踐:express 最佳實踐(六) express 自省獲得所有的路由

nodejs 實踐&#xff1a;express 最佳實踐(六) express 自省獲得所有的路由 某些情況下&#xff0c;你需要知道你的應用有多少路由&#xff0c;這在 express 中沒有方法可以。因此我這邊曲線了一下&#xff0c;做成了一個函數進行處理。遍歷所有的方法進行處理。 代碼 const _ …

使用vue組件搭建網頁應用

使用vue組件搭建網頁應用搭建開發環境開發組件搭建開發環境 搭建一個 vue 項目最快的方式就是使用 vue cli 腳手架進行初始化&#xff0c;包含了所有完整的依賴及開發配置。 首先全局安裝 vue cli&#xff0c;打開 cmd 命令提示符 或者 power shell&#xff0c;輸入以下命令&…

重新整理 .net core 實踐篇 —linux上排查問題實用工具 [外篇]

前言介紹下面幾個工具:Lldbcreatedumpdotnet-dumpdotnet-gcdumpdotnet-symbolProcdump該文的前置篇為:https://www.cnblogs.com/aoximin/p/16839812.html獻給初學者&#xff0c;這篇就只介紹下看下日志和lldb&#xff0c;畢竟東西太多了。正文我以官網的例子作為演示&#xff1…

Office 365離線安裝

Office 365除了可以在線安裝外&#xff0c;還可以進行離線安裝&#xff0c;但激活還是需要連接互聯網的喲首先下載Office部署工具https://www.microsoft.com/en-us/download/details.aspx?id49117 下載文件后&#xff0c;運行自解壓縮可執行文件&#xff0c;其中包含 Office 部…

reduceByKey和groupByKey區別與用法

2019獨角獸企業重金招聘Python工程師標準>>> 在Spar看中&#xff0c;我們知道一切的操作都是基于RDD的。在使用中&#xff0c;RDD有一種非常特殊也是非常實用的format——pair RDD&#xff0c;即RDD的每一行是&#xff08;key, value&#xff09;的格式。這種格式很…

python自動化測試-D6-學習筆記之一(常用模塊補充datetime模塊)

# datetime 模塊import datetimeprint(datetime.datetime.today()) #當前日期&#xff0c;到秒 打印結果&#xff1a;2018-01-21 10:23:46.034410print(datetime.datetime.now()) # 當前日期&#xff0c;到秒 打印結果&#xff1a;2018-01-21 10:23:46.034410print(datetime.d…

Vue如何在data中正確引入圖片路徑

方法一&#xff1a;將圖片資源放入項目 /static 目錄下&#xff0c;使用絕對或相對路徑引用即可 // 文件結構 |-- src | |-- components | | |-- banner.vue |-- static | |-- images | | |-- pic.jpg<template><div id"banner"><img :s…

軟件工程的第一性原理丨SmartIDE

作者&#xff1a;徐磊原文地址&#xff1a;https://smartide.cn/zh/blog/2022-1022-software-engineering/徐磊英捷創軟科技&#xff08;北京&#xff09;有限公司創始?/?席架構師 / CEO / SmartIDE開源項?創始?。微軟最有價值專家MVP&#xff0c;微軟區域技術總監&#xf…

排序算法之快速排序詳解

一、算法介紹 快速排序&#xff1a;快速排序的基本思想是通過一次排序將等待的記錄分成兩個獨立的部分&#xff0c;其中一部分記錄的關鍵字小于另一部分的關鍵字。C部分的快速排序一直持續到整個序列被排序。 任取一個元素 (如第一個) 為中心提出所有小于它的元素&#xff0c;并…

openstack 中國聯盟公開課參會總結

主流趨勢 1. openstack defcore 互操作性認證。打通不同的openstack 廠商之間的連接2. 首批OpenStack管理員認證(COA)將于2016年進行3. 混合云應用廣泛 Cloud Broker,cascading openstack 云連接器4. DevOps5. 虛擬桌面6. Storage 方面&#xff0c;Ceph和Glusterfs 7. Network…

bzoj1088[SCOI2005]掃雷Mine

1088: [SCOI2005]掃雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4284 Solved: 2552[Submit][Status][Discuss]Description 相信大家都玩過掃雷的游戲。那是在一個n*m的矩陣里面有一些雷&#xff0c;要你根據一些信息找出雷來。萬圣節到了&#xff0c;“余”人國流…

Re:從零開始的Vue項目搭建

Re&#xff1a;從零開始的Vue項目搭建初始的終結與結束的開始Nodejs項目的簡單測試從零開始webpack開發模式webpack編譯打包后記初始的終結與結束的開始 最開始接觸vue項目搭建是從vue-cli開始&#xff0c;模板式操作&#xff0c;一鍵搞定&#xff0c;幾乎可以無縫進入代碼開發…

在數據庫插入帶小數點數據的問題

想在mysql插入以下數據設計表的時候沒有注意,之前都用的int,這次換成了double,但是插入第一條3.50的時候數據庫顯示為:查了之后知道是設計表的時候沒有注意小數點的設置轉載于:https://juejin.im/post/5c0f61bb6fb9a049ea38cbe9

oracle 11g 創建 job 20

15-10-19 23:48:04分類&#xff1a; Oracle--創建一次執行的匿名塊任務&#xff0c;成功調用一次后job消失BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name > my_new_job2, job_type > PLSQL_BLOCK, job_action &g…

Jzoj5317 Func

f(1)1 f(2x)f(x) f(2x1)f(x)f(x1) 給出n<10^6&#xff0c;求:所有的i滿足f(i)n 第一道類歐算法 我們考慮一個性質 f(2x1)f(x)f(x1)f(2x)f(2x2) 所以&#xff0c;顯然有f(2x1)>f(2x) f(2x1)>f(2x2) 那么現在我們知道了f(2x1),自然考慮枚舉一個f(2x) 可以按照以下形式…

C# WPF 用代碼畫一幅圖(*精品*)

概述有時候我們的程序界面中需要顯示一些簡單的示意圖&#xff0c;一般我們有原圖的話直接嵌入我們程序就可以&#xff0c;但有時候我們沒有原圖&#xff0c;這時候我們不妨用代碼自己畫出來.今天小編要給大家展示的是這樣一副圖片&#xff1a;接下來&#xff0c;我就用代碼純手…

礦難讓顯卡壓了那么多貨咋辦?NV如是說

2019獨角獸企業重金招聘Python工程師標準>>> 在蘇州 GTC 開幕的幾天前&#xff0c;英偉達剛剛遭遇了一次股價的腰斬。 近來加密貨幣的熱度漸低&#xff0c;受到挖礦熱潮照顧許多的英偉達「礦機」銷量受到打擊&#xff0c;甚至出現了嚴重的庫存危機&#xff0c;加上近…

花式看超級碗 人工智能、大數據在碗里

“超級碗”可不是一個大碗!!!超級碗(Super Bowl)是美國國家美式足球聯盟(也稱為國家橄欖球聯盟)的年度冠軍賽&#xff0c;勝者被稱為“世界冠軍”。超級碗一般在每年1月最后一個或2月第一個星期天舉行&#xff0c;那一天稱為超級碗星期天(Super Bowl Sunday)。超級碗是比賽的名…

Git分支操作與遠程倉庫的使用

Git分支操作本地倉庫創建分支合并分支刪除分支遠程倉庫push 推送遠程分支pull 拉取遠程分支fetch 更新遠程分支本地分支與遠程分支的跟蹤關系本地倉庫 由于Git的分布式特性&#xff0c;所以沒有絕對的本地和遠程概念&#xff0c;一切都是相對的。對于分支的操作&#xff0c;個…

SimMechanics/Second Generation倒立擺模型建立及初步仿真學習

筆者最近搗鼓Simulink&#xff0c;發現MATLAB的仿真模塊真的十分強大&#xff0c;以前只是在命令窗口敲點代碼&#xff0c;直到不小心敲入simulink&#xff0c;就一發不可收拾。話說simulink的模塊化建模確實方便&#xff0c;只要拖拽框框然后雙擊設置屬性就可以慢慢堆建自己的…