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); //序列化成JSON
Person 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格式了 //反序列化Deserialize
Person 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 关羽 21 object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}"); //将Json字符转换为Object类型
//Person p4 = obj as Person; //此行代码转为的p4为null
Person 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();
//注册转换器的方法,用于复杂转换 除了实现还需要注册到JavaScriptSerializer
jss.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); //默认的序列化层次是100 Person 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}}} //现在将层次减少到1
jss.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; }
//里面嵌套一个Person
public 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; }
}

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象的更多相关文章
- 类对象序列化为json串,json串反序列化为类对象
1.类对象序列化为json串: 方法一: class P(object): def __init__(self,name,age,sex): self.name=name self.age=age s ...
- Python: Json串反序列化为自定义类对象
最近刚接触到python,就想到了如何反序列化json串.网上找了一下,大部分都是用json模块反序列化为python数据结构(字典和列表).如果对json模块不了解的参考菜鸟教程.然后我在此基础上将 ...
- 将Dictionary序列化为json数据 、json数据反序列化为Dictionary
需要引用System.Web.Extensions dll类库 /// <summary> /// 将json数据反序列化为Dictionary /// </summary> ...
- 将JSON字符串反序列化为指定的.NET对象类型
目录导航: 前言: 方法一.在项目中定义对应的对象参数模型,用于映射反序列化出来的参数(复杂JSON字符串数据推荐使用): 方法二.直接将JSON字符串格式数据反序列化转化为字典数据(简单JSON字符 ...
- C# Json数据反序列化为Dictionary并根据关键字获取指定值1
Json数据: { "dataSet": { "header": { "returnCode": "0", " ...
- C# Json数据反序列化为Dictionary并根据关键字获取指定值
Json数据: { "dataSet": { "header": { "returnCode": "0", " ...
- C#:Json数据反序列化为Dictionary并根据关键字获取指定的值
转自曾是土木人原文 C#:Json数据反序列化为Dictionary并根据关键字获取指定的值 Json数据: { "dataSet": { "header": ...
- JSON字符串反序列化成对象_部分属性值反序列化失败
简介:本人在开发webapi接口时遇到了:一个复杂的Json字符串在反序列化为对象时报,无法发序列化其中的一个属性对象? 使用方法: InternalRecommendRequestFormModel ...
- ObjC 巧用反射和KVC实现JSON快速反序列化成对象
1.简单的KVC介绍 KVC是一种间接访问对象属性的机制,不直接调用getter 和 setter方法,而使用valueForKey 来替代getter 方法,setValue:forKey来代替se ...
- C#Json数据反序列化为Dictionary并根据关键字获取指定的值
Json数据: { "dataSet": { "header": { ", "errorInfo": "HTTP请求错误 ...
随机推荐
- 简单的div蒙层
;;;; } $("#userLogin").click(function () { var heights = (parseInt($(window). ...
- Unity 开发游戏Game分辨率设置
最近自己开发小游戏,突然又被Game视图中设置分辨率被诱惑了, 我到底该怎么设置分辨率设置的图片才能让电脑和手机尺寸显示的大小一模一样呢? 然后又被手机尺寸和分辨率迷惑了! =.= 越搞越混 分辨 ...
- sql执行顺序整理
sql的执行顺序,是优化sql语句执行效率必须要掌握的.各个数据库可能有细小的差别,但大体顺序是相同的,这里只做大致说明. 一.总体执行顺序 在sql语句执行之前,还有SQL语句准备执行阶段,这里不做 ...
- 关于safari上的select宽高问题小技,自定义下拉框
之前一直用windows做开发,最近换了个mac,在几经折腾之下,安装完了各种开发工具,IDE等,然后欣然打开自己正在开发的网站.突然发现mac上所有的下拉框都变了,都是默认样式,无论padding, ...
- Gym Class(拓扑排序)
Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- jQuery Pagination Ajax分页插件中文详解(摘)
jQuery Pagination Ajax分页插件中文详解 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxin ...
- thinkphp框架的路径问题 - 总结
thinkphp框架的路径问题 - 总结 (2011-06-21 11:01:28) 转载▼ 标签: thinkphp 框架 路径 杂谈 分类: Php TP中有不少路径的便捷使用方法,比如模板中使用 ...
- T4运行时模板
可以通过Visual Studio运行时文本模板在您的应用程序在运行时生成文本字符串. 执行应用程序的计算机不必具有 Visual Studio. 运行库模板有时称为"预处理文本模板&quo ...
- vs2013 JS代码提示
1.JS提示 在Js文件头部加 /// <reference path="ext-all-dev.js" /> 要求引用的js和本js在同一目录,否则需要全部路径
- Funsion Charts 学习(二)
下载FusionCharts 3.1网址为 http://www.onlinedown.net/soft/92224.htm 第一个demo 新建一个文件夹,命名为demo 在文件夹中新建一个两个文件 ...