浅析JavaScriptSerializer类的序列化与反序列化

前端之家收集整理的这篇文章主要介绍了浅析JavaScriptSerializer类的序列化与反序列化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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 ActionResult GetJson()
{
JavaScriptSerializer jss = new JavaScriptSerializer();
Person p = new Person(1,"张飞",20);
string json = jss.Serialize(p); //序列化成JSON
Person p1 = jss.Deserialize(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代码

javascriptSerializer类测试

试下4个基础方法属性

方法 // 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("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age); //输出 1 关羽 21
//Deserialize的非泛型写法
Person p3 = jss.Deserialize("{\"Id\":1,\"Age\":21}",typeof(Person)) as Person; //注意这个方法返回的是object类,因此要强制转换成Person类
Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age); //同样输出 1 关羽 21

object obj = jss.DeserializeObject("{\"Id\":1,\"Age\":21}"); //将Json字符转换为Object类型
//Person p4 = obj as Person; //此行代码转为的p4为null
Person p4 = jss.ConvertToType(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属性用于枚举此转换器支持的类型。

JavaScriptSerializer jss = new JavaScriptSerializer();
//注册转换器的方法,用于复杂转换  除了实现还需要注册到JavaScriptSerializer
jss.RegisterConverters(new JavaScriptConverter[] { new DataTableConverter() });

string strJson = jss.Serialize(dt);
Console.WriteLine(strJson);
//输出 {"Rows":[{"Id":"1","Age":"21"},{"Id":"2","Name":"刘备","Age":"22"},{"Id":"3","Name":"张飞","Age":"20"}]}

Console.ReadKey();
}
}

///


/// DataTable JSON转换类
///

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();
}

///


/// 获取本转换器支持的类型
///

public override IEnumerable SupportedTypes
{
get { return new Type[] { typeof(DataTable) }; }
}
}

限制序列化的层次

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,"Age":24,"p":{"Id":2,"Age":23,"p":{"Id":3,"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,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]禁止属性序列化

输出 {"Id":1,"Age":24} Console.ReadKey(); } }

public class Person
{
public Person()
{ }

public Person(int id,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; }
}

以上就是本文的全部内容,希望对大家有所帮助,谢谢对编程之家的支持

原文链接:https://www.f2er.com/js/44294.html

猜你在找的JavaScript相关文章