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.mzph.cn/news/281350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用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;的格式。这种格式很…

软件工程的第一性原理丨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…

Re:从零开始的Vue项目搭建

Re&#xff1a;从零开始的Vue项目搭建初始的终结与结束的开始Nodejs项目的简单测试从零开始webpack开发模式webpack编译打包后记初始的终结与结束的开始 最开始接触vue项目搭建是从vue-cli开始&#xff0c;模板式操作&#xff0c;一键搞定&#xff0c;几乎可以无缝进入代码开发…

C# WPF 用代码画一幅图(*精品*)

概述有时候我们的程序界面中需要显示一些简单的示意图&#xff0c;一般我们有原图的话直接嵌入我们程序就可以&#xff0c;但有时候我们没有原图&#xff0c;这时候我们不妨用代码自己画出来.今天小编要给大家展示的是这样一副图片&#xff1a;接下来&#xff0c;我就用代码纯手…

矿难让显卡压了那么多货咋办?NV如是说

2019独角兽企业重金招聘Python工程师标准>>> 在苏州 GTC 开幕的几天前&#xff0c;英伟达刚刚遭遇了一次股价的腰斩。 近来加密货币的热度渐低&#xff0c;受到挖矿热潮照顾许多的英伟达「矿机」销量受到打击&#xff0c;甚至出现了严重的库存危机&#xff0c;加上近…

花式看超级碗 人工智能、大数据在碗里

“超级碗”可不是一个大碗!!!超级碗(Super Bowl)是美国国家美式足球联盟(也称为国家橄榄球联盟)的年度冠军赛&#xff0c;胜者被称为“世界冠军”。超级碗一般在每年1月最后一个或2月第一个星期天举行&#xff0c;那一天称为超级碗星期天(Super Bowl Sunday)。超级碗是比赛的名…

SimMechanics/Second Generation倒立摆模型建立及初步仿真学习

笔者最近捣鼓Simulink&#xff0c;发现MATLAB的仿真模块真的十分强大&#xff0c;以前只是在命令窗口敲点代码&#xff0c;直到不小心敲入simulink&#xff0c;就一发不可收拾。话说simulink的模块化建模确实方便&#xff0c;只要拖拽框框然后双击设置属性就可以慢慢堆建自己的…

10 行代码提取复杂 Excel 数据

把 Excel 文件导入关系数据库是数据分析业务中经常要做的事情&#xff0c;但许多 Excel 文件的格式并不规整&#xff0c;需要事先将其中的数据结构化后再用 SQL 语句写入数据库。而一般情况下&#xff0c;结构化的工作量会比较大&#xff0c;而且很难通用&#xff0c;每次都要针…

人工智能模型的网络结构可视化

本文主要介绍人工智能模型的网络结构可视化的常见方法。对于使用神经网络模型来说&#xff0c;我们主要关注的是模型的输入和输出。在 ML.NET 中使用 ONNX 模型时&#xff0c;我们就需要了解这些信息&#xff0c;以便在构成神经网络的所有层之间生成连接映射。下图就是昨天 《Y…

整理ASP.NET MVC 5各种错误请求[401,403,404,500]的拦截及自定义页面处理实例

http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/article/details/51003683 ASP.NET MVC 5的开发中&#xff0c;服务器的各种错误[如&#xff1a;401&#xff08;登录授权验证&#xff09;&#xff0c;403&#xff08;禁止…

编辑器领域正发生变革?从面试看 Visual Studio Code 的崛起

Visual Studio Code&#xff08;VS Code&#xff09;的使用率在迅速上升&#xff0c;现在已经成为大多数工程师的首选编辑器&#xff0c;并似乎正迅速抢占其他顶级编辑的市场份额。Triplebyte 每周都会面试数百名工程师。在每次面试中&#xff0c;我们都会记录面试者使用的编辑…

C#7.0 ref引用传递

1.概要在工作中大家用到引用类型是非常多的&#xff0c;大家都知道引用类型在使用过程中传递的是对象引用并不会发生整个对象复制。而值类型在传递的过程中就不一样了&#xff0c;我曾经在编写代码时希望通过值类型来压低应用程序的内存占用&#xff0c;在高并发的情况大量的对…

android面试详解

前台就是和用户交互的进程 可见进程例如一个activity被一个透明的对话框覆盖&#xff0c;该activity就是可见进程 服务&#xff1a;service进程 后台一个activity按了home按键就是从前台退回到后台 标准模式&#xff1a;不管任务栈是否存在相同的activity都会创建一个新的activ…

element-ui Notification重叠问题,原因及解决办法

在1个方法中调用两次this.$notify方法&#xff0c;会出现通知框重叠的问题 methods: {checkLogin: function () {if (this.username ) {this.$notify({title: 提示,message: 请输入用户名})}if (this.password ) {this.$notify({title: 提示,message: 请输入用户密码})}}}网上…

Visual Stiudio使用技巧

技巧1 自动生成带参构造函数当我们在编写代码时会经常遇到初始化一个的类&#xff0c;需要通过构造函数进行对象初始化。那么这个时候我们可能会需要逐个去手动写&#xff0c;这样的工作即重复又无趣。如果是在项目非常紧急的情况下还有大量的字段需要与入参一一对应起来简直太…